如何匹配排序规则集 SQL 服务器数据库中不区分大小写的确切单词

How to match exact word case insensitive in collation set SQL Server database

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

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服务器。

这里有一些想法

  1. 改为使用不区分大小写的排序方式来整理您正在比较的列。您可以在运行时执行此操作,或创建一个不区分大小写的单独计算列。
  2. 首先将要进行模式匹配的字符串转换为小写 (LOWER()),这样您就不必担心大小写混合问题
  3. 对于你的通配符表达式,而不是只有 [a-z][a-zA-Z]

这可以通过 LIKELOWER 到 return car 不分大小写来完成,并且 car_ 其中 _ 是任意的非字母数字值。

declare @table table (c1 varchar(64))
insert into @table
values
('car'),
('CAR'),
('car.'),
('Car!'),

('carrot'),
('carrier'),
('car1'),
('Firstcar'),
('1car'),
('cars'),    --i added this value to NOT be returned
('carcarcar')

select *
from @table
where 
    lower(c1) = 'car'
    or (lower(c1) like ('car_')
    and right(c1,1) like ('[^0-9]')
    and right(lower(c1),1) like ('[^a-z]'))

最简单的方法是简单地指定 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 

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

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

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

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

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