连接 2 个表区分大小写
join 2 tables case sensitive upper and lower case
我有 2 个表,需要获取有关品牌代码的结果。
例如,在数据库中我有 2 个不同的品牌,但它们的代码相同(仅大小写不同)。例如:
代码名称
耐克
AB 阿迪达斯
如何在代码上内连接 2 个表以分别得到这 2 个?
现在,在内部联接之后,我得到了这 2 个的总和。
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON A.Code=B.Code
GROUP BY Code, BrandName
这个查询会给我错误的结果,因为它没有区分大小写。
请帮忙:)
由于您使用的排序规则不区分大小写并且想要区分大小写,请尝试使用 collate
关键字和合适的区分大小写的排序规则:
INNER JOIN B
ON A.Code COLLATE Latin1_General_CS_AS_KS_WS = B.Code COLLATE Latin1_General_CS_AS_KS_WS
至少有两种快速方法可以解决这个问题。
1. 您为 A.Code 和 B.Code 指定区分大小写的排序规则(比较字符集中字符的字符串的规则)。在 MySQL 和其他一些数据库管理系统中,默认排序规则不区分大小写。
也就是说,假设您使用的是 MySQL 或类似的,您必须这样修改您的语句:
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON A.Code=B.Code COLLATE latin1_bin
GROUP BY Code, BrandName
但是,如果您计划只对 A 和 B 执行区分大小写的查询,那么将这两个表的默认排序规则设置为区分大小写可能符合您的利益。
请看How can I make SQL case sensitive string comparison on MySQL?
2. 将 A.Code 和 B.Code 转换为二进制字符串并比较两者。这是一种逐字节比较两个字符串的简单方法,从而实现不区分大小写。
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON BINARY A.Code=B.Code
GROUP BY Code, BrandName
COLLATE 对我尝试的任何事情都不起作用,因为数据库是 utf8 格式并且不会转换。但是,我能够使用 md5 哈希比较,并且 md5 函数区分大小写..
INNER JOIN B ON md5(A.Code) = md5(B.Code)
Note: I don't think this a particularly good solution as it requires a
hash calculation on every value every time instead of using stored
values, and it has a potential for collision with high row counts. I
was using it on a small sample size with a one-off query and it worked
well for my situation, so I wanted to throw it out there in case it
helps others!
我有 2 个表,需要获取有关品牌代码的结果。
例如,在数据库中我有 2 个不同的品牌,但它们的代码相同(仅大小写不同)。例如:
代码名称 耐克 AB 阿迪达斯
如何在代码上内连接 2 个表以分别得到这 2 个?
现在,在内部联接之后,我得到了这 2 个的总和。
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON A.Code=B.Code
GROUP BY Code, BrandName
这个查询会给我错误的结果,因为它没有区分大小写。
请帮忙:)
由于您使用的排序规则不区分大小写并且想要区分大小写,请尝试使用 collate
关键字和合适的区分大小写的排序规则:
INNER JOIN B
ON A.Code COLLATE Latin1_General_CS_AS_KS_WS = B.Code COLLATE Latin1_General_CS_AS_KS_WS
至少有两种快速方法可以解决这个问题。
1. 您为 A.Code 和 B.Code 指定区分大小写的排序规则(比较字符集中字符的字符串的规则)。在 MySQL 和其他一些数据库管理系统中,默认排序规则不区分大小写。
也就是说,假设您使用的是 MySQL 或类似的,您必须这样修改您的语句:
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON A.Code=B.Code COLLATE latin1_bin
GROUP BY Code, BrandName
但是,如果您计划只对 A 和 B 执行区分大小写的查询,那么将这两个表的默认排序规则设置为区分大小写可能符合您的利益。
请看How can I make SQL case sensitive string comparison on MySQL?
2. 将 A.Code 和 B.Code 转换为二进制字符串并比较两者。这是一种逐字节比较两个字符串的简单方法,从而实现不区分大小写。
SELECT Code, BrandName, Count(*) QTY, SUM(Price) TOTAL
FROM A
INNER JOIN B
ON BINARY A.Code=B.Code
GROUP BY Code, BrandName
COLLATE 对我尝试的任何事情都不起作用,因为数据库是 utf8 格式并且不会转换。但是,我能够使用 md5 哈希比较,并且 md5 函数区分大小写..
INNER JOIN B ON md5(A.Code) = md5(B.Code)
Note: I don't think this a particularly good solution as it requires a hash calculation on every value every time instead of using stored values, and it has a potential for collision with high row counts. I was using it on a small sample size with a one-off query and it worked well for my situation, so I wanted to throw it out there in case it helps others!