35

我正在尝试查找包含 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%';

这两种方法都有效,分别返回包含“pending”和“PENDING”的记录。所以问题似乎出在LIKE克劳斯的模式匹配上。

我可以做些什么来执行这个区分大小写的搜索?

4

3 回答 3

51

尝试使用COLLATE Latin1_General_BIN而不是COLLATE Latin1_General_CS_AS

于 2013-02-26T01:11:09.200 回答
32

由于@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 中提交了一个错误:使用Microsoft 标记为“按设计”的COLLATE Latin1_General_CS_AS 的范围时,Case-SENSITIVITY 不起作用。

我通过使用 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
于 2013-02-26T00:32:29.407 回答
1

我使用以下内容:

SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS
于 2016-03-02T10:35:08.380 回答