繁体   English   中英

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

[英]SQL Server LIKE operator with character range and case sensitive column

你能解释一下为什么后面的查询返回不符合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条件中使用范围时才会出现此错误。 当我将[bd]更改为[bcd]时一切正常。

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

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

不,这不是一个错误。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM