如何使用LIKE执行区分大小写的搜索?

时间:2013-02-26 00:30:11

标签: sql-server-2008 pattern-matching sql-like collate

我正在尝试查找包含大写6个或更多字母数字字符串的记录。一些例子:

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克劳斯的模式匹配。

如何执行区分大小写的搜索?

3 个答案:

答案 0 :(得分:46)

尝试使用COLLATE Latin1_General_BIN而不是COLLATE Latin1_General_CS_AS

答案 1 :(得分:27)

由@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上提交了一个错误,Microsoft将其标记为“按设计”。

我通过使用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

答案 2 :(得分:0)

我使用以下内容:

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