如何在排序规则集SQL Server数据库中匹配不区分大小写的精确单词

时间:2018-06-20 19:57:42

标签: sql-server collation case-insensitive exact-match

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

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。

3 个答案:

答案 0 :(得分:1)

最简单的方法是简单地指定一个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来将字符串解释为区分大小写的排序规则即可。

答案 1 :(得分:0)

这里有几个主意

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

答案 2 :(得分:0)

可以使用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]')) 是任何非字母数字值。

*** arch - x64
c:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o tiltmod.dll tmp.def RcppExports.o UBMM.o -Ld:/Compiler/gcc-4.9.3/local330/lib/x64 -Ld:/Compiler/gcc-4.9.3/local330/lib -LC:/PROGRA~1/R/R-33~1.1/bin/x64 -lR
C:\Rtools\mingw_32\bin\nm.exe: C:/Users/chongma/Documents/Academic Archive/C++ practice/Rcpp2/tiltmod/tiltmod.Rcheck/00_pkg_src/tiltmod/src-x64/RcppExports.o: File format not recognized

C:\Rtools\mingw_32\bin\nm.exe: C:/Users/chongma/Documents/Academic Archive/C++ practice/Rcpp2/tiltmod/tiltmod.Rcheck/00_pkg_src/tiltmod/src-x64/UBMM.o: File format not recognized