具有字符范围和区分大小写列的SQL Server LIKE运算符

时间:2014-01-14 11:05:39

标签: sql sql-server

你能解释一下为什么后面的查询返回不符合LIKE条件的行。 表中的列具有区分大小写的排序规则,因此查询不应返回任何内容。

CREATE TABLE #temp (col CHAR COLLATE SQL_Latin1_General_CP1_CS_AS);
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E');
SELECT * FROM #temp WHERE col LIKE '[b-d]';

任何其他区分大小写的排序规则(即Latin1_General_100_CS_AS,Polish_100_CS_AS,Modern_Spanish_100_CS_AS)也无法正常工作。

据我所知,只有二进制排序集合(Latin1_General_100_BIN2,Modern_Spanish_100_BIN2)效果很好。

只有在LIKE条件下使用范围时才会出现此错误。当我将[b-d]更改为[bcd]时,一切正常。

这是数据库引擎中的错误吗?

我在Windows NT 6.1(Build 7601:Service Pack 1)上使用Microsoft SQL Server 2008(SP3) - 10.0.5846.0(X64)企业版(64位)

2 个答案:

答案 0 :(得分:4)

不,这不是一个错误。

模式语法中的范围不是正则表达式。它定义了排序规则排序顺序下的范围。

这些排序规则排序AaBbCcDd...YyZz(大写和小写混合),这是预期的结果。

二进制排序规则排序AB .... YZ .... ab ... yz(大写和小写分隔),这就是为什么它适用于那些。

答案 1 :(得分:1)

显示您在答案中发布的示例的顺序:

CREATE TABLE #temp (col CHAR);
INSERT INTO #temp VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('a'), ('b'), ('c'), ('d'), ('e');
-- This will work (ABCDEabcde):
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_BIN
-- These will order letters:
SELECT * FROM #temp ORDER BY col COLLATE Latin1_General_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE Polish_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE Modern_Spanish_100_CS_AS
SELECT * FROM #temp ORDER BY col COLLATE SQL_Latin1_General_CP1_CS_AS