【问题标题】:join 2 tables case sensitive upper and lower case连接2个表区分大小写
【发布时间】:2015-06-14 12:21:12
【问题描述】:

我有 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

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

请帮忙:)

【问题讨论】:

  • 你应该定义你正在使用的数据库引擎。
  • MS SQL。 Sql管理工作室
  • 定义数据库将是帮助人们帮助您的良好开端。但我认为这是一份整理工作。阅读它。

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


【解决方案1】:

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

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

【讨论】:

  • 我不确定您是否需要在连接的两侧指定排序规则 - ON A.Code = B.Code COLLATE Latin1_General_CS_AS_KS_WS 可能就足够了
  • 酷,很高兴知道 - 我以前没有使用过 collat​​e。
【解决方案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

【讨论】:

  • 更改为 BINARY 实际上是个坏主意,因为某些排序规则会比较重音字符的相等性,例如,尽管二进制形式会有所不同。
【解决方案3】:

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

INNER JOIN B ON md5(A.Code) = md5(B.Code)

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

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多