加入2个表区大小写敏感的大小写

时间:2015-04-09 08:19:47

标签: sql sql-server inner-join case-sensitive

我有2张桌子,需要在品牌代码上获得结果。

在数据库中我有两个不同的品牌,但他们的代码是相同的(只有大小写的差异)。例如:

代码名称 ab耐克 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

这个查询会给我错误的结果,因为它不会敏感地加入大写和小写。

请帮忙:)

3 个答案:

答案 0 :(得分:5)

由于您使用不区分大小写的排序规则并希望区分大小写,请使用collate关键字并使用合适的区分大小写的排序规则:

INNER JOIN B
ON A.Code COLLATE Latin1_General_CS_AS_KS_WS  = B.Code COLLATE Latin1_General_CS_AS_KS_WS 

答案 1 :(得分:2)

至少有两种快速解决方法。

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

答案 2 :(得分:0)

COLLATE 对我尝试的任何事情都不起作用,因为数据库采用 utf8 格式并且无法转换。但是,我能够使用 md5 哈希比较,并且 md5 函数区分大小写..

INNER JOIN B ON md5(A.Code) = md5(B.Code)
<块引用>

注意:我认为这不是一个特别好的解决方案,因为它需要一个 每次都对每个值进行哈希计算,而不是使用存储的 值,并且它有可能与高行数发生冲突。一世 使用一次性查询在小样本量上使用它并且它起作用了 很适合我的情况,所以我想把它扔在那里以防万一 帮助他人!