意外输出sql server使用count

时间:2015-02-12 07:06:50

标签: sql-server

我正在使用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

3 个答案:

答案 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.

了解更多相关信息