Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server通配符范围(例如[A-D])如何处理区分大小写的排序规则?_Sql_Sql Server_Tsql - Fatal编程技术网

SQL Server通配符范围(例如[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]%'

有人能解释一下通配符范围(例如[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]%';
只返回以大写字母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