Sim*_*wsi 9 sql t-sql sql-server
任何人都可以解释通配符字符范围(例如[AD])如何与区分大小写的排序规则一起使用的规则吗?
我会想到以下几点
WHERE CharColumn LIKE '[A-D]%';
Run Code Online (Sandbox Code Playgroud)
只返回以大写字母A,B,C或D开头的记录,并排除以小写字母a,b,c或d开头的记录.
然而,实际上,它似乎返回以大写字母A开头的记录,但也记录以B或b,C或c和D或d开头的记录.这就像只有范围的第一个字符区分大小写,范围中的其余字符不区分大小写.
另一方面,以下
WHERE CharColumn LIKE '[ABCD]%';
Run Code Online (Sandbox Code Playgroud)
并仅返回与上壳体A,B,C或D.然而,我会想到开始记录[AD]将相当于[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
*/
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 11
你需要二进制整理,如Md.Elias Hossain所说.
解释是模式语法中的范围适用于排序规则排序顺序规则.
在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同.
所以
;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
Run Code Online (Sandbox Code Playgroud)
返回
C
----
a
A
b
B
c
C
d
D
Run Code Online (Sandbox Code Playgroud)
因此范围A-D排除a但包括CS整理下的其他3个小写字母.
Eli*_*ain 10
它可以以任何一种方式完成:
一个.COLLATE在创建表时使用:
CREATE TABLE #TEST_LIKE_Patterns
(
ID INT IDENTITY(1,1),
CharColumn VARCHAR(100) COLLATE Latin1_General_BIN
);
Run Code Online (Sandbox Code Playgroud)
湾 COLLATE选择数据时使用
SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '%[A-D]%' COLLATE Latin1_General_BIN;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13198 次 |
| 最近记录: |