使用Chinese_Hong_Kong_Stroke_90_CI_AS排序规则时SQL Server中的模糊匹配

时间:2019-01-16 02:53:35

标签: sql sql-server

假设我们创建一个如下表:

create table my_table (
id int, 
city nvarchar(256) collate Chinese_Hong_Kong_Stroke_90_CI_AS)

INSERT INTO my_table (id, city)
VALUES (1, 'Shanghai');

INSERT INTO my_table (id, city)
VALUES (2, 'Shandong');

INSERT INTO my_table (id, city)
VALUES (3, 'Shanxi');

INSERT INTO my_table (id, city)
VALUES (4, 'Shaanxi');

my_table中现在有四个记录:

id  city
1   Shanghai
2   Shandong
3   Shanxi
4   Shaanxi

以下SQL查询返回相同的数字。如何避免此错误?

select top 1 id from my_table order by DIFFERENCE(city, 'Shanghai') desc
select top 1 id from my_table order by DIFFERENCE(city, 'Shandong') desc

另一个问题:

select top 1 id from my_table order by DIFFERENCE(city, 'Shannxi') desc 

正确答案应为4时返回3。

1 个答案:

答案 0 :(得分:1)

此问题是由您的列排序规则引起的。根据文档SOUNDEXDIFFERENCE取决于排序规则。

可能的解决方案是:

select top 1 id
from my_table
order by DIFFERENCE(city collate SQL_Latin1_General_CP1_CI_AS, 'Shanghai') desc

select top 1 id
from my_table
order by DIFFERENCE(city collate SQL_Latin1_General_CP1_CI_AS, 'Shandong') desc

我想我会添加另一列SQL_Latin1_General_CP1_CI_AS归类的列,该列存储与city完全相同的值。

尽管准确了解您要完成的工作会很有趣?因为在您当前的排序规则中,这两个词听起来完全一样。

也值得一读Beyond SOUNDEX & DIFFERENCE