谁能解释一下为什么SQL函数(使用SQL Server2019)返回的结果在我看来是违反直觉的?以下是问题和分数:

SELECT 
    DIFFERENCE('Good', 'Good Samaritans'); --Result is 4 (High score match)

SELECT 
    DIFFERENCE('Samaritans', 'Good Samaritans'); --Result is 1 (Low score match)

SELECT 
    DIFFERENCE('Sam', 'Good Samaritans'); --Result is 2 (A higher score than above!)

我知道DIFFERENCE使用SOUNDEX来匹配辅音,但上面的结果似乎非常奇怪,特别是在第二个查询中.这与空格和前面的字符串有关吗?

推荐答案

如果你改变了单词的顺序,你会发现第一个单词有偏差.然后,如果你考虑SOUNDEX,你就会开始理解为什么.也请阅读下面的参考资料.

Soundex将字母数字字符串转换为四个字符的代码,该代码基于字符串在英语中的发音.这个 代码的第一个字符是的第一个字符 CHARACTER_EXPRESS,转换为大写.第二个到第二个 代码的第四个字符是代表字母的数字 在表达式中.字母A、E、I、O、U、H、W和Y将被忽略 除非它们是字符串的第一个字母.将零添加到 如有必要,结束,以产生四个字符的代码.了解更多 有关Soundex代码的信息,请参阅The Soundex Indexing System

-- Bias based on left to right order of words
SELECT 10 id, DIFFERENCE('Good', 'Good Samaritans') --Result is 4 (High score match)
union all
SELECT 11 id, DIFFERENCE('Good', 'Samaritans Good') --Result is 1 (Low score match)
union all
SELECT 20, DIFFERENCE('Samaritans', 'Good Samaritans') --Result is 1 (Low score match)
union all
SELECT 21, DIFFERENCE('Samaritans', 'Samaritans Good') --Result is 4 (High score match)
union all
SELECT 30, DIFFERENCE('Sam', 'Good Samaritans') --Result is 2 (On the upper low side)

id (No column name)
10 4
11 1
20 1
21 4
30 2

fiddle

你对difference岁的期望可能太高了.

Sql相关问答推荐

SQL查询以创建手头的流动余额?

更新PostgreSQL 15中的JSON值

Oracle 23c ROUND,数据类型为DATE

从类似JSON的字符串列创建新列

同一表的Oracle SQL更新(含YTD合计)

最小非重复集的SQL查询

删除所有订单中可用的重复值

SQL查询正在工作,但返回空结果

SQL按组 Select 最小值,当值不存在时为Null

VS代码无法识别SQL代码中带括号的字符串

SQL中相同表内的VLOOKUP等价

连续天跟踪购买情况(将标记返回到另一列?)

Select 一个非零值减少重复

DB2 SQL查询结果多余数据

确定小数中使用的精度位数

当 2 列具有静态值并且第 3 列使用运算符 IN 时,对 PostgreSQL 和 3 列上的复杂索引的最佳查询

在没有订单的情况下,如何生成一个值为0的顾客天数行

批量更改WooCommerce中所有产品的税收状态

SQL 按 id 运行总计并受条件限制(在窗口上)

Athena:从字符串birth_dt列计算年龄