SQL Server通配符范围(例如[A-D])如何处理区分大小写的排序规则?
有人能解释一下通配符范围(例如[a-D])如何与区分大小写的排序规则一起工作的规则吗 我会这样想SQL Server通配符范围(例如[A-D])如何处理区分大小写的排序规则?,sql,sql-server,tsql,Sql,Sql Server,Tsql,有人能解释一下通配符范围(例如[a-D])如何与区分大小写的排序规则一起工作的规则吗 我会这样想 WHERE CharColumn LIKE '[A-D]%'; 将仅返回以大写字母A、B、C或D开头的记录,并排除以小写字母A、B、C或D开头的记录 然而,实际上,它似乎返回以大写字母A开头的记录,但也返回以B或B、C或C以及D或D开头的记录。这就像只有范围中的第一个字符区分大小写,而范围中的其余字符不区分大小写一样 另一方面,以下是 WHERE CharColumn LIKE '[ABCD]%'
WHERE CharColumn LIKE '[A-D]%';
将仅返回以大写字母A、B、C或D开头的记录,并排除以小写字母A、B、C或D开头的记录
然而,实际上,它似乎返回以大写字母A开头的记录,但也返回以B或B、C或C以及D或D开头的记录。这就像只有范围中的第一个字符区分大小写,而范围中的其余字符不区分大小写一样
另一方面,以下是
WHERE CharColumn LIKE '[ABCD]%';
只返回以大写字母A、B、C或D开头的记录。但我原以为[A-D]等同于[ABCD]
我在SQLServer2005和SQLServer2008R2中得到了相同的结果
示例:(使用SQL Server 2008行构造函数编写的insert语句用于紧凑性。如果每个值都有自己的insert语句,则脚本将在SQL Server 2005中工作) 试一试
使用区分大小写的排序规则适用于不在范围内的搜索字符串,例如,这将适用于:
SELECT *
FROM #TEST_LIKE_Patterns
WHERE (
CharColumn LIKE 'A%' COLLATE Latin1_General_CS_AS
OR CharColumn LIKE 'B%' COLLATE Latin1_General_CS_AS
OR CharColumn LIKE 'C%' COLLATE Latin1_General_CS_AS
OR CharColumn LIKE 'D%' COLLATE Latin1_General_CS_AS
);
…但显然这不是一个可接受的方法
正如其他人所建议的,对范围使用
Latin1\u General\u BIN
。可以通过以下两种方式完成:
a。创建表格时使用COLLATE
:
CREATE TABLE #TEST_LIKE_Patterns
(
ID INT IDENTITY(1,1),
CharColumn VARCHAR(100) COLLATE Latin1_General_BIN
);
b。选择数据时使用COLLATE
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '%[A-D]%' COLLATE Latin1_General_BIN;
您需要一个二进制排序规则,如中所示 解释是模式语法中的范围使用排序规则排序顺序规则 在范围搜索中,范围中包含的字符可能会有所不同 取决于排序规则的排序规则 所以 返回
C
----
a
A
b
B
c
C
d
D
因此,范围
A-D
不包括A
,但包括CS
排序规则下的其他3个小写字母 COLLATE Latin1\u General\u CS\u,因为在创建表时使用了
,但这不起作用,您的查询提供了相同的结果(没有更改)。@Md.EliasHossain:谢谢,我没有正确测试。现在更新。谢谢,这完全回答了我的问题。我试图理解范围搜索的明显任意结果背后的逻辑。现在很清楚了。干杯,西蒙。谢谢,我不知道你可以在WHERE子句中指定排序规则。这在查询我没有设计的数据库时非常有用。此外,我还没有想到使用二进制排序规则来代替区分大小写的排序规则。干杯,用Latin1\u General\u BIN
代替Latin1\u General\u CS\u,因为对我有用
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '%[A-D]%' COLLATE Latin1_General_BIN;
;WITH T(C) AS
(
SELECT 'A' UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' UNION ALL
select 'a' union all
select 'b' union all
select 'c' union all
select 'd'
)
SELECT *
FROM T
ORDER BY C COLLATE Latin1_General_CS_AS
C
----
a
A
b
B
c
C
d
D