如何在排序规则集中匹配不区分大小写的确切单词 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。

最简单的方法是简单地指定一个排序规则。下面是一个示例:

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 表示将字符串解释为区分大小写的排序规则。

这里有几个想法

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

这可以通过LIKELOWER来完成,无论大小写如何,都返回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]'))

最新更新