首页 文章

SQL Server通配符字符范围(例如[A-D])如何处理区分大小写的排序规则?

提问于
浏览
9

任何人都可以解释通配符字符范围的规则,例如[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]%';

does 只返回以大写字母A,B,C或D开头的记录 . 但我认为[A-D]相当于[ABCD] .

我在SQL Server 2005和SQL Server 2008 R2中获得了相同的结果 .

例:
(插入使用SQL Server 2008行构造函数编写的语句,以实现紧凑性 . 如果每个值都有自己的insert语句,则脚本将在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
*/

4 回答

  • 11

    尝试

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

    它可以以任何一种方式完成:

    一个 . 创建表时使用 COLLATE

    CREATE TABLE #TEST_LIKE_Patterns
    ( 
        ID INT IDENTITY(1,1),
        CharColumn VARCHAR(100) COLLATE Latin1_General_BIN
    );
    

    湾选择数据时使用 COLLATE

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

    您需要二进制排序规则,如Md. Elias Hossain's answer所示 .

    解释是模式语法中的范围可以解决排序规则排序顺序规则 .

    From BOL

    在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同 .

    所以

    ;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个小写字母 .

  • 3

    使用区分大小写的排序规则适用于不在范围内的搜索字符串,例如这会工作:

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

相关问题