SQL Server通配符范围,例如[A-D],如何使用区分大小写的排序



谁能解释通配符范围(例如[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]。

在SQL Server 2005和SQL Server 2008 R2中得到相同的结果。

例子:
使用SQL Server 2008行构造器编写的插入语句是为了紧凑。如果每个值都有自己的插入语句,脚本将在SQL Server 2005中工作)

CREATE TABLE #TEST_LIKE_Patterns
    ( 
        ID INT IDENTITY(1,1),
        CharColumn VARCHAR(100) COLLATE Latin1_General_CS_AS
    );
--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('aaa'), ('aAA'), ('AAA'), ('Aaa');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('bbb'), ('bBB'), ('BBB'), ('Bbb');
--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ccc'), ('cCC'), ('CCC'), ('Ccc');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ddd'), ('dDD'), ('DDD'), ('Ddd');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('eee'), ('eEE'), ('EEE'), ('Eee');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('fff'), ('fFF'), ('FFF'), ('Fff');
--------------
-- Raw Data:
SELECT *
FROM #TEST_LIKE_Patterns;
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[A-D]%';
-- Results:
/*
ID   CharColumn
--------------
3    AAA
4    Aaa
5    bbb
6    bBB
7    BBB
8    Bbb
9    ccc
10   cCC
11   CCC
12   Ccc
13   ddd
14   dDD
15   DDD
16   Ddd
*/

SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[ABCD]%';    
-- Results:
/*
ID   CharColumn
    --------------
3    AAA
4    Aaa
7    BBB
8    Bbb
11   CCC
12   Ccc
15   DDD
16   Ddd
*/

您需要按照dr . Elias Hossain的回答所指示的二进制排序。

解释是模式语法中的范围不符合Collation排序顺序规则。

从波尔

在范围搜索中,范围中包含的字符可能不同取决于排序规则。

;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

因此范围A-D不包括a,但包含CS排序下的其他3个小写字母。

两种方式都可以:

。在创建表时使用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;

try

SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn  LIKE '[A-D]%' COLLATE Latin1_General_BIN;

对于不在某个范围内的搜索字符串,使用区分大小写的排序也有效,例如:

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_General_BIN作为范围

最新更新