加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:24:50 所属栏目:MsSql教程 来源:网络整理
导读:任何人都可以解释通配符字符范围的规则,例如[A-D],如何使用区分大小写的排序规则? 我会想到以下几点 WHERE CharColumn LIKE '[A-D]%'; 只返回以大写字母A,B,C或D开头的记录,并排除以小写字母a,b,c或d开头的记录. 然而,实际上,它似乎返回以大写字母A开头的记
任何人都可以解释通配符字符范围的规则,例如[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,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
*/

解决方法

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

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

From BOL

In range searches,the characters included in the range may vary
depending on the sorting rules of the 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个小写字母.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读