"SELECT DISTINCT" 忽略大小写差异。

55

我有一个问题,需要从一个表中选择一些不同的值(特定列为nvarchar类型)但是MSSQL Server 2000会出现相同但大小写不同的值,例如(伪代码):

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

将返回

A,b

但我确实希望(并期望)

A,a,b,B

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

如何解决这个问题?


2
你在这个列中使用什么排序规则? - Rowland Shaw
4个回答

85

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

你需要像这样做

Select distinct col1 COLLATE sql_latin1_general_cp1_cs_as
From dbo.myTable

2
我以前不知道COLLATE,但那就是解决方案。 - powerbar
4
别忘了加上"as col1",以避免在结果中丢失列名! - MKorsch
latin1_general_ci 适用于大多数拉丁字符,但是根据 show collation 显示的 utf8mb4_unicode_ci 应该适用于所有字符。 - Cees Timmerman
我不得不删除我的GROUP BY子句才能使它工作。 - Adam Huffman
@AdamHuffman你应该在你的GROUP BY子句中使用“COLLATE” - robotik
1
@CeesTimmerman,任何_ci都表示不区分大小写。我们正在尝试使用区分大小写的排序规则来区分“A”和“a”。这些是排序名称的后缀:_ai = 不区分重音符号; _as = 区分重音符号; _ci = 不区分大小写; _cs = 区分大小写; _bin = 二进制。 - robotik

12

不确定在MS SQL中是否适用,但在MySQL或PostgreSQL中,可以使用BINARY来执行此操作。将该列强制转换为二进制,如下所示:

使用BINARY函数,将列强制转换为二进制。

SELECT DISTINCT BINARY(column1) from table1;

根据您的模式,只需更改column1table1

在MySQL 5.7中适用的完整示例,应该也适用于其他版本:

SELECT DISTINCT BINARY(gateway) from transactions;

干杯!


1
更加简洁的选项! - brianlmerritt
这样好多了。我不想更改每个表的排序规则,以便进行像这样的搜索。 - carla
1
请注意,这是针对MySQL而不是被要求的Microsoft SQL。 - ArieKanarie
我真的很希望这能在Postgres上运行,但没有成功。 - ateymour
在Postgres中,不需要将其转换为二进制形式,它是否适用于您?尝试使用SELECT DISTINCT column1 from table1。或者如果您需要像这样转换一些内容,可以尝试使用SELECT DISTINCT name::text from clients; - radtek

4
SELECT DISTINCT
   CasedTheColumn 
FROM
   (
   SELECT TheColumn COLLATE LATIN1_GENERAL_BIN AS CasedTheColumn
   FROM myTAble
   )FOO
WHERE
   CasedTheColumn IN ('A', 'a'...)

1

尝试将相关列的排序规则设置为二进制格式,例如utf8-bin。您可以通过两种方式实现:SELECT语句中直接进行设置或直接更改表结构(这意味着每次运行查询时都不必映射排序规则,因为它会正确存储在内部)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接