MYSQL - 空格问题分组依据
MYSQL - Whitespace issue Group By
我正在执行 UNION
,同时获得相同类型的信息(company_name、vat,以及email) 来自两个不同的表(adv 和 pub)。 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 的行,当我尝试复制它们以便明白为什么他们没有被过滤,我面临以下结果。
'1DNAF SARL', '123456', NULL
'1DNAF SARL ', '', NULL
即使我使用 TRIM()
函数,它也无法正常工作,因此,GROUP BY
不会认为这些记录相同,也不会删除其中一个。我该如何解决这个问题?
顺便说一下,当我尝试分别 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;
我正在执行 UNION
,同时获得相同类型的信息(company_name、vat,以及email) 来自两个不同的表(adv 和 pub)。 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 的行,当我尝试复制它们以便明白为什么他们没有被过滤,我面临以下结果。
'1DNAF SARL', '123456', NULL
'1DNAF SARL ', '', NULL
即使我使用
TRIM()
函数,它也无法正常工作,因此,GROUP BY
不会认为这些记录相同,也不会删除其中一个。我该如何解决这个问题?
顺便说一下,当我尝试分别 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;