簡體   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