首页 > 解决方案 > 如何在排序规则集 SQL Server 数据库中匹配不区分大小写的确切单词

问题描述

我的数据库中设置了以下排序规则:

COLLATE SQL_Latin1_General_CP1_CS_AS

我想匹配一个确切的单词 - 不区分大小写。我正在使用以下查询,但它不起作用。

String sql = "UPDATE BODYCONTENT SET BODY = CAST(REPLACE(CAST(BODY as nvarchar(max)), ? , ?) as ntext) WHERE BODY like '%[^a-z0-9]' + ? + '[^a-z0-9]%' OR" + 
            " BODY like ? + '[^a-z0-9]%' OR" + 
            " BODY like '%[^a-z0-9]' + ? OR" + 
            " BODY like ?";

当我在另一个未设置排序规则的数据库中使用类似的东西时,结果如预期:

select * 
from dbo.persons 
where LastName like '%[^a-z0-9]Dan[^a-z0-9]%' 
   or LastName like 'Dan[^a-z0-9]%' 
   or LastName like '%[^a-z0-9]Dan' 
   or LastName like 'Dan';

请让我知道如何处理设置排序规则的数据库。

如何匹配一个确切的单词 - 不区分大小写。

示例:我想匹配这些单词:

 car
 CAR
 car.
 Car!

我不想匹配这些词:

carrot
carrier
car1
Firstcar
1car
carcarcar

数据库是 SQL Server。

标签: sql-servercollationcase-insensitiveexact-match

解决方案


最简单的方法是简单地指定一个 COLLATION。这是一个例子:

SELECT 'True' WHERE 'x' COLLATE Latin1_General_CI_AI = 'X' COLLATE Latin1_General_CI_AI 
SELECT 'True' WHERE 'x' COLLATE Latin1_General_CS_AS = 'X' COLLATE Latin1_General_CS_AS 

请注意,当您运行这两个语句时,它们中只有一个返回“True”......不区分大小写的版本。您的数据库是什么排序规则也无关紧要,因为您正在使用显式排序规则覆盖该排序规则。

使用上面的示例,它将是这样的:

select * 
from dbo.persons 
where LastName COLLATE Latin1_General_CS_AS like '%Dan%' COLLATE Latin1_General_CS_AS;

这将执行区分大小写的搜索,仅匹配“Dan”在姓氏中某处的位置。

COLLATE 语句类似于特定排序规则的 CAST()。因此,当您的数据库默认不区分大小写时,只需使用 COLLATE 将字符串解释为区分大小写的排序规则。


推荐阅读