2010-04-15 76 views
27

我遇到问题,MSSQL Server 2000应该从表中选择一些不同的值(具体列是nvarchar类型)。 有有时相同的值,但不同的情况下,例如(伪):“SELECT DISTINCT”忽略不同情况

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

将返回

A,b 

但我想(并期望)

A,a,b,B 

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

如何解决这个问题?

+2

您对列使用什么排序规则? – 2010-04-15 11:40:38

回答

47

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

你需要做这样的事情

Select distinct col1 COLLATE sql_latin1_general_cp1_cs_as 
From dbo.myTable 
+0

我不知道COLLATE,但那是解决方案。 只要我被允许(6分钟左右),我会接受这个。 谢谢! – powerbar 2010-04-15 11:46:35

+4

不要忘记添加'作为col1',以避免结果丢失列名! – MKorsch 2014-07-03 11:42:28

+0

'latin1_general_ci'适用于大多数拉丁字符,但是'utf8mb4_unicode_ci',如['show collat​​ion'](https://dev.mysql.com/doc/refman/5.7/en/show-collat​​ion.html)所示为一切工作。 – 2017-10-11 08:20:02

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

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

4

对此操作使用BINARY。转换列,以二进制像这样:

SELECT DISTINCT BINARY(column1) from table1; 

只要改变column1table1按您的架构。

是在MySQL 5.7为我的作品完整的示例,应该为别人工作:

SELECT DISTINCT BINARY(gateway) from transactions; 

干杯!

+0

更清洁的选择! – brianlmerritt 2016-07-29 08:25:54

+0

这太好了。我不想改变每个表格的排序规则,我必须像这样进行搜索。 – carla 2017-06-26 14:22:09