Han*_*ood 30 pattern-matching collate sql-server-2008 sql-like
我正在尝试查找包含大写6个或更多字母数字字符串的记录.一些例子:
PENDING 3RDPARTY CODE27
Run Code Online (Sandbox Code Playgroud)
我正在使用以下声明:
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]%';
Run Code Online (Sandbox Code Playgroud)
这将返回包含任何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]%';
Run Code Online (Sandbox Code Playgroud)
这没有任何改变.无论如何,它仍会返回带有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%';
Run Code Online (Sandbox Code Playgroud)
这两种方法都有效,分别返回包含"待定"和"待定"的记录.所以问题似乎是LIKE
克劳斯的模式匹配.
如何执行区分大小写的搜索?
Mit*_*eat 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;
Run Code Online (Sandbox Code Playgroud)
您需要将整理符后要匹配的字符串,而不是列:
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;
Run Code Online (Sandbox Code Playgroud)
更新:虽然我上面的答案是正确的,但在Connect上存在一个错误:Case-SENSITIVITY在使用与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
Run Code Online (Sandbox Code Playgroud)
成功.按预期返回3行.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS
Run Code Online (Sandbox Code Playgroud)
成功.按预期返回3行.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS
Run Code Online (Sandbox Code Playgroud)
成功.按预期返回3行.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS
Run Code Online (Sandbox Code Playgroud)
失败.返回3334行(这是所有姓氏以'n'和'N'结尾)
更新:感谢@GeraldSv,这有效:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34294 次 |
最近记录: |