MYSQL - 空格问题分组依据

MYSQL - Whitespace issue Group By

我正在执行 UNION,同时获得相同类型的信息(company_namevat,以及email) 来自两个不同的表(advpub)。 SQL 查询如下:

SELECT TRIM(UPPER(company_name)), vat, company_owner_email FROM (
    (SELECT company_name, vat, admin.email as company_owner_email FROM pub
        LEFT JOIN admin ON pub.manager = admin.id
        WHERE company_name > '')
        UNION
    (SELECT company_name, vat, admin.email as company_owner_email FROM adv
        LEFT JOIN admin ON adv.manager = admin.id
        WHERE company_name > '')
    ) company
GROUP BY company_name
ORDER BY company_name;

但是,当我 运行 这个查询时,我得到一些具有相同 company_name 的行,当我尝试复制它们以便明白为什么他们没有被过滤,我面临以下结果。

顺便说一下,当我尝试分别 TRIM() company_name 字段时,它在两个字段中都有效,但加入结果无法正常工作。

试试这个:

SELECT TRIM(UPPER(company_name)), vat, company_owner_email FROM (
    (SELECT company_name, vat, admin.email as company_owner_email FROM pub
        LEFT JOIN admin ON pub.manager = admin.id
        WHERE company_name > '')
        UNION
    (SELECT company_name, vat, admin.email as company_owner_email FROM adv
        LEFT JOIN admin ON adv.manager = admin.id
        WHERE company_name > '')
    ) company
GROUP BY TRIM(UPPER(company_name))
ORDER BY TRIM(UPPER(company_name));

尝试使用 Group by TRIM(UPPER(company_name))

因为to TRIM和UPPER是在分组后应用的。 尝试将功能移动到较低级别:

SELECT company_name, vat, company_owner_email FROM (
    (SELECT TRIM(UPPER(company_name)) as company_name, vat, admin.email as company_owner_email FROM pub
        LEFT JOIN admin ON pub.manager = admin.id
        WHERE company_name > '')
        UNION
    (SELECT TRIM(UPPER(company_name)) as company_name, vat, admin.email as company_owner_email FROM adv
        LEFT JOIN admin ON adv.manager = admin.id
        WHERE company_name > '')
    ) company
GROUP BY company_name
ORDER BY company_name;

不过要小心结果。如果你在两个表中有不同的增值税值 MySQL 不会抛出错误!它只会给你一个或另一个。

SELECT TRIM(UPPER(company_name)), vat, company_owner_email FROM (
    (SELECT company_name, vat, admin.email as company_owner_email FROM pub
        LEFT JOIN admin ON pub.manager = admin.id
        WHERE company_name > '')
        UNION
    (SELECT company_name, vat, admin.email as company_owner_email FROM adv
        LEFT JOIN admin ON adv.manager = admin.id
        WHERE company_name > '')
    ) company
GROUP BY UPPER(replace(company_name,' ',''))
ORDER BY company_name;

我试过下面的查询。

select replace('1DNAF SARL ',' ','') ='1DNAFSARL';

它正在返回 1。这意味着它将两个记录视为相同。

尝试上面的查询。

试试这个:

SELECT TRIM(CHAR(9) FROM TRIM(UPPER(company_name))) as cpm, vat, company_owner_email FROM (
(SELECT company_name, vat, admin.email as company_owner_email FROM pub
    LEFT JOIN admin ON pub.manager = admin.id
    WHERE company_name > '')
    UNION
(SELECT company_name, vat, admin.email as company_owner_email FROM adv
    LEFT JOIN admin ON adv.manager = admin.id
    WHERE company_name > '')
) company
GROUP BY TRIM(CHAR(9) FROM TRIM(UPPER(company_name)))
ORDER BY cpm;

这会在 trim 去掉空格后 trim 去掉制表符。列中很可能有制表符和空格。

最好在 SELECT(如何显示)和 GROUP(如何分组)中以不同方式规范化公司名称:

考虑可能存在中间有2个空格或字符串末尾有TAB SPACE TAB的情况。所以我宁愿使用替换而不是 TRIM().

SELECT UPPER(company_name), vat, company_owner_email FROM (
    (SELECT company_name, vat, admin.email as company_owner_email FROM pub
        LEFT JOIN admin ON pub.manager = admin.id
        WHERE company_name > '')
        UNION
    (SELECT company_name, vat, admin.email as company_owner_email FROM adv
        LEFT JOIN admin ON adv.manager = admin.id
        WHERE company_name > '')
    ) company
GROUP BY replace(replace(replace(replace(company_name,'\t',''), ' ', ''), '.', ''), ',','')
ORDER BY company_name;