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

Sql server 2008 如何使用LIKE执行区分大小写的搜索?,sql-server-2008,pattern-matching,sql-like,collate,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]%'; SELECT Details FROM MyTable WHERE Details COLLATE Latin1_General_CS_AS LIKE

我正在尝试查找包含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]%';
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个或更多字母单词的所有记录,不考虑大小写

我添加了一个
COLLATE
语句:

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]%';
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%';
这两种方法都有效,返回的记录分别包含“待定”和“待定”。因此,这个问题似乎与克劳斯的模式匹配类似


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

由于@GeraldSv更新:使用排序规则
Latin1\u General\u 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:上存在一个bug,微软已将其标记为“按设计”

我在Person.Person表中使用AdventureWorks2008R2(不区分大小写,开箱即用默认值)进行了验证,我将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
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS
成功。按预期返回3行

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS
成功。按预期返回3行

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS
失败。返回3334行(全部以“n”和“n”结尾的Lastname)

更新:感谢@GeraldSv,这项工作:

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

尝试使用
COLLATE-Latin1\u-General\u-BIN
而不是
COLLATE-Latin1\u-General\u-CS\u-AS

我使用以下方法:

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

尝试使用COLLATE Latin 1_General_BINPerfect!想得出一个答案吗?为什么?为了得到几分。我只是喜欢知道我帮助过的满足感。当时,你的答案是唯一有效的。正确地标记它有助于后代。:-)感谢所有的研究!这就是我所寻找的。谢谢你