我正在使用sql-server 2012
查询是:
CREATE TABLE TEST ( NAME VARCHAR(20) );
INSERT TEST
( NAME
)
SELECT NULL
UNION ALL
SELECT 'James'
UNION ALL
SELECT 'JAMES'
UNION ALL
SELECT 'Eric';
SELECT NAME
, COUNT(NAME) AS T1
, COUNT(COALESCE(NULL, '')) T2
, COUNT(ISNULL(NAME, NULL)) T3
, COUNT(DISTINCT ( Name )) T4
, COUNT(DISTINCT ( COALESCE(NULL, '') )) T5
, @@ROWCOUNT T6
FROM TEST
GROUP BY Name;
DROP TABLE TEST;
在结果集中,没有' JAMES' ? (帽)
请告诉我们这是如何排除的
预计为Null,james,JAMES,eric
答案 0 :(得分:3)
您需要将Name
列对照更改为Latin1_General_CS_AS
case sensitive
SELECT NAME COLLATE Latin1_General_CS_AS,
Count(NAME) AS T1,
Count(COALESCE(NULL, '')) T2,
Count(Isnull(NAME, NULL)) T3,
Count(DISTINCT ( Name )) T4,
Count(DISTINCT ( COALESCE(NULL, '') )) T5,
@@ROWCOUNT T6
FROM TEST
GROUP BY Name COLLATE Latin1_General_CS_AS;
答案 1 :(得分:2)
使用COLLATE Latin1_General_CS_AS
等敏感案例归类。
CREATE TABLE TEST ( NAME VARCHAR(20) COLLATE Latin1_General_CS_AS );
答案 2 :(得分:1)
此处评论的其他人都是正确的。
如果你搜索整理和区分大小写,你会更容易理解它们的含义,但用外行的话来说就是这样:
整理有点像编码;它确定字符串列中的字符如何被解释,排序和相互比较。不区分大小写表示大写/小写被认为完全相同,因此例如'JAMES','james','JaMeS'等与SQL Server没有区别。因此,当您的数据库具有不区分大小写的排序规则,然后您创建一个包含列而不定义排序规则的表时,该列将继承数据库使用的默认排序规则,这就是我们到达此处的方式。
您可以手动更改列排序规则,或在查询期间定义它,但请记住,每当您比较两个不同的列时,您需要分配它们以使用相同的排序规则,否则您将收到错误。这就是为什么在整个数据库中使用相同的排序规则,除非特殊查询特定的情况,否则这是一个好习惯。
关于 Latin1_General_CS_AS 的含义,您的问题基本上是指“Latin1_General”字母,您可以在线查看详细信息。 “CS”部分表示区分大小写,如果它不区分大小写,则会看到“CI”。 “AS”表示重音敏感度,“AI”表示重音不敏感。基本上,'Á'是否被认为等于'A'。
您可以从源here.
了解更多相关信息