我正在尝试查找包含大写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
克劳斯的模式匹配。
如何执行区分大小写的搜索?
答案 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