Sql server 使用计数的sql server意外输出
我正在使用sql server 2012 查询是:Sql server 使用计数的sql server意外输出,sql-server,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'; SEL
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;
在结果集中没有“詹姆斯”?(大写)
请告诉我这是怎么排除的
预期为
Null,james、james、eric
使用敏感的大小写排序规则,如COLLATE Latin1\u General\u CS\u AS
CREATE TABLE TEST ( NAME VARCHAR(20) COLLATE Latin1_General_CS_AS );
您需要将
名称
列排序规则更改为Latin1\u General\u CS\u AS
,该排序规则区分大小写
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;
在这里发表评论的其他人是正确的 如果你在谷歌上搜索排序规则和区分大小写,你会更容易理解它们的含义,但用外行的话说,是这样的: 排序规则有点像编码;它确定字符串列中的字符的解释、排序和相互比较方式。不区分大小写意味着大写/小写被认为完全相同,因此例如“JAMES”、“JAMES”、“JAMES”等与SQL Server没有区别。因此,当您的数据库具有不区分大小写的排序规则,并且您随后创建了一个包含列的表,而不定义排序规则时,该列将继承数据库使用的默认排序规则,这就是我们在这里介绍的方式 您可以手动更改列排序规则,也可以在查询过程中对其进行定义,但请记住,无论何时比较两个不同的列,都需要将它们指定为使用相同的排序规则,否则将出现错误。这就是为什么最好在整个数据库中使用相同的排序规则,除非特殊的查询特定情况 关于你的问题,关于什么是拉丁字母,它基本上是“拉丁字母”的意思,你可以在线查看详细信息。“CS”部分表示区分大小写,如果它不区分大小写,您将看到“CI”。“AS”表示重音敏感,“AI”表示重音不敏感。基本上,“Á”是否被视为等于“A”
你可以从源代码中阅读更多关于它的信息,
COLLATE-Latin1\u-General\u-CS\u-AS代码>它对查询所做的事情?@ HaleMaaHaRkRISHNA数据库排序是不区分大小写的,它将考虑<代码>杰姆斯< /代码>,<代码>杰姆斯< /代码>和<代码>杰姆斯< /代码>。code>COLLATE Latin1\u General\u CS\u AS
将使查询区分大小写COLLATE Latin1\u General\u CS\u AS;它对查询有什么影响代码>@HareRamaHareKrishna读到,它比任何人试图在评论中解释它要好得多