2013-02-26 42 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