首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server通配符范围(例如[A])如何处理区分大小写的排序规则?

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

Stack Overflow用户
提问于 2011-12-07 04:47:01
回答 4查看 14.5K关注 0票数 9

有人能解释通配符字符范围(如a)如何使用区分大小写的排序规则吗?

我本以为

代码语言:javascript
运行
复制
WHERE CharColumn LIKE '[A-D]%';

只返回以大写A、B、C或D开头的记录,而不包括以小写a、b、c或d开头的记录。

然而,在现实中,它似乎返回以大写A开头的记录,但也返回以b或b、C或c、d或d开头的记录。这就好像范围的第一个字符是区分大小写的,而范围中的其余字符不区分大小写。

另一方面,以下几点

代码语言:javascript
运行
复制
WHERE CharColumn LIKE '[ABCD]%';

只返回以大写A、B、C或D开头的记录,但我认为an相当于ABCD。

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

示例:

(插入使用Server 2008行构造函数编写的语句以确保紧凑性。如果每个值都有自己的insert语句,则脚本将在Server 2005中工作)

代码语言:javascript
运行
复制
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
*/
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-07 08:30:38

您需要一个二进制排序规则,如医学博士。伊莱亚斯·侯赛因的回答中所示。

其解释是模式语法中的范围工作在排序规则排序规则上。

从波尔

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

所以

代码语言:javascript
运行
复制
;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

返回

代码语言:javascript
运行
复制
C
----
a
A
b
B
c
C
d
D

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

票数 11
EN

Stack Overflow用户

发布于 2011-12-07 07:40:51

这两种方法都可以做到:

在创建表时使用COLLATE,如下所示:

代码语言:javascript
运行
复制
CREATE TABLE #TEST_LIKE_Patterns
( 
    ID INT IDENTITY(1,1),
    CharColumn VARCHAR(100) COLLATE Latin1_General_BIN
);

b.在选择数据时使用COLLATE

代码语言:javascript
运行
复制
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '%[A-D]%' COLLATE Latin1_General_BIN;
票数 10
EN

Stack Overflow用户

发布于 2011-12-07 05:25:53

试一试

代码语言:javascript
运行
复制
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn  LIKE '[A-D]%' COLLATE Latin1_General_BIN;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8410523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档