【问题标题】:"SELECT DISTINCT" ignores different cases“SELECT DISTINCT”忽略不同的情况
【发布时间】:2010-04-15 11:38:22
【问题描述】:

我有一个问题,MSSQL Server 2000 应该从表中选择一些不同的值(特定列是 nvarchar 类型)。 有时会有相同的值,但有不同的情况,例如(伪代码):

SELECT DISTINCT * FROM ("A", "a", "b", "B")

会回来

A,b

但我确实想要(并且确实期望)

A,a,b,B

因为它们实际上是不同的值。

如何解决这个问题?

【问题讨论】:

  • 你对列使用什么排序规则?

标签: sql sql-server


【解决方案1】:

排序规则将设置为不区分大小写。

你需要做这样的事情

Select distinct col1 COLLATE sql_latin1_general_cp1_cs_as
From dbo.myTable

【讨论】:

  • 我不知道 COLLATE,但这就是解决方案。我会接受这个,只要我被允许(还剩 6 分钟)。谢谢!
  • 不要忘记添加 'as col1' 以避免在结果中丢失列名!
  • latin1_general_ci 适用于大多数拉丁字符,但utf8mb4_unicode_ci,如show collation 所示,应该适用于所有字符。
  • 我必须删除我的 GROUP BY 子句才能让它工作。
【解决方案2】:

不确定 MS SQL 但使用 MySQL 或 postgres,请使用 BINARY 进行此操作。像这样将列转换为二进制:

SELECT DISTINCT BINARY(column1) from table1;

只需根据您的架构更改column1table1

在 MySQL 5.7 中适用于我的完整示例应该适用于其他人:

SELECT DISTINCT BINARY(gateway) from transactions;

干杯!

【讨论】:

  • 更清洁的选择!
  • 这样好多了。我不想更改必须进行这样搜索的每个表的排序规则。
  • 注意:这是针对 MySQL,而不是 Microsoft SQL。
  • 我真的希望这能在 Postgres 上工作,但没有运气
  • 它在没有转换为二进制的情况下在 postgres 中对您有用吗?试试SELECT DISTINCT column1 from table1。或者,如果你需要投出这样的东西,也许SELECT DISTINCT name::text from clients;
【解决方案3】:
SELECT DISTINCT
   CasedTheColumn 
FROM
   (
   SELECT TheColumn COLLATE LATIN1_GENERAL_BIN AS CasedTheColumn
   FROM myTAble
   )FOO
WHERE
   CasedTheColumn IN ('A', 'a'...)

【讨论】:

    【解决方案4】:

    尝试将相关列的collation 设置为二进制,例如utf8-bin。您可以这样做in the SELECT statement itself 或直接更改表结构(这意味着它不必在每次运行查询时都映射排序规则,因为它会在内部正确存储它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多