我的数据库中设置了以下排序规则:
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 表示将字符串解释为区分大小写的排序规则。
这里有几个想法
- 改为将要比较的列与不区分大小写的排序规则进行排序。您可以在运行时执行此操作,也可以创建一个不区分大小写的单独计算列。
- 首先将要进行模式匹配的字符串转换为小写 (
LOWER()
(,这样您就不必担心混合大小写 - 对于您的通配符表达式,而不仅仅是
[a-z]
具有[a-zA-Z]
这可以通过LIKE
和LOWER
来完成,无论大小写如何,都返回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]'))