微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 DISTINCT 改变文字字符串的大小写

如何解决为什么 DISTINCT 改变文字字符串的大小写

我有以下针对 Access 数据库的简化查询

  • 构建表:CREATE TABLE test (id TEXT)
  • 填充:INSERT INTO test VALUES ('4711')
  • 查询
SELECT
  id,'value','Value'
FROM 
  test

收益

id Expr1001 Expr1002
4711 价值 价值

现在使用 disTINCT 的相同查询改变了第二个文字字符串的大小写:

SELECT disTINCT
  id,'Value'
FROM 
  test

收益

id Expr1001 Expr1002
4711 价值 价值

无论查询是通过 OleDb 还是直接通过 MS Access,结果都是一样的。数据库引擎如何更改文字值?我知道 jet sql 有时很奇怪 - 但这在我看来就像一个错误。还是在某处描述了这种行为?

解决方法

这主要是猜测,但我认为正在发生的事情如下:

SELECT DISTINCT x 等于 SELECT x GROUP BY x 并转换为它。

GROUP BY 中的列被去重,根据整理规则,'value' 等于 'Value',因此只处理第一次出现。

对于每一列,它要么是一个常量(计算一次)、一个聚合列(为每个组计算),要么是一个组列。由于 'value'GROUP BY 中且 'Value' 等于 'value',因此它们都映射到组 'value'

当按单个列分组时,我们也可以看到这种行为:

SELECT
  id,'value','Value'
FROM 
  test
GROUP BY
  id

GROUP BY 子句中没有“值”,解析为表达式

id Expr1001 Expr1002
4711 价值 价值
SELECT
  id,'Value'
FROM 
  test
GROUP BY
  id,'valuE'

'value''valuE' 相等,因此 Expr1001 是一个组列 'valuE'Value' 也是如此

id Expr1001 Expr1002
4711 价值 价值

使用了 GROUP BY 子句中的字符串,即使两个字符串都没有使用该大写。

据我所知,这种行为并没有被记录在案。记录的是在评估组时忽略大写,例如您可以执行 SELECT ID,MAX(SomeColumn) FROM MyTable GROUP BY id 并且 Access 不会抱怨 ID 子句中没有 GROUP BY 列,但奇怪的是这也适用于常量和 DISTINCT。显而易见的解决方法是:不要按常量分组,当您有带有常量的 GROUP BY 子句时,使用 DISTINCT 而不是 SELECT

如果我们将此行为与 T-SQL 进行比较,它不允许在 GROUP BY 部分使用常量,因此不会遇到这种行为。 GROUP BY id,'valuE' 不是有效的 T-SQL。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。