2013-02-26 40 views
26

我正在試圖查找包含大寫字母的6個或更多字母數字字符的記錄。一些例子:如何使用LIKE執行區分大小寫的搜索?

PENDING 3RDPARTY CODE27 

我用以下語句:

SELECT Details 
FROM MyTable 
WHERE Details LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

這回不管情況下,任何包含6色或更多個字母的單詞的所有記錄。

我添加了一個COLLATE聲明:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

這改變不了什麼。無論大小寫如何,它仍然以6個或更多字母的單詞返回記錄。

就像一個測試,我想:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%pending%'; 

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%PENDING%'; 

的這些工作都,返回一個包含「待定」分別爲「待定」的記載。所以這個問題似乎由LIKE克勞斯的模式匹配。

如何才能執行此區分大小寫的搜索?

+6

嘗試使用COLLATE Latin1_General_BIN – 2013-02-26 01:08:49

+0

完美!想要做出答案? – 2013-02-26 01:11:11

+1

爲什麼?得到幾點。我只是因爲知道我的幫助而感到滿意。 – 2013-02-26 01:16:07

回答

36

嘗試使用COLLATE Latin1_General_BIN而不是COLLATE Latin1_General_CS_AS

26

更新由於@GeraldSv:使用排序規則Latin1_General_BIN

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_BIN; 

您需要將字符串放置整理符後進行匹配,而不是列:

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_CS_AS; 

更新:雖然我上面的回答是正確的,但在Connect:Case-SENSITIVITY doesn't work when using a range in like with COLLATE Latin1_General_CS_AS上有一個錯誤,微軟已標記爲「By Design」。

我用AdventureWorks2008R2(不區分大小寫,開箱即用默認的),在Person.Person表我改變3個在「N」到「N」結尾的姓氏,然後運行以下查詢驗證:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%N' COLLATE Latin1_General_CS_AS 

成功。按預期返回3行。

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS 

成功。按預期返回3行。

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS 

成功。按預期返回3行。

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS 

失敗。返回3334行(這是所有姓氏的結局在 'n' 和 'N')

更新:由於@GeraldSv,這個工程:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN 
+0

感謝您的所有研究! – 2013-02-26 01:19:34

0

我使用以下內容:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS