gpt4 book ai didi

sql-server - 为什么当切换要比较的字符串顺序时,Difference 函数会给出不同的结果?

转载 作者:行者123 更新时间:2023-12-02 11:37:27 24 4
gpt4 key购买 nike

在 SQL Server 中,如果我执行以下操作:

Difference ('Kennady', 'Kary') : I get 2

如果我这样做:

Difference ('Kary', 'Kennady') : I get 3.

我认为 Difference 函数会查看底层的 Soundex 值,并给出 0-4 的数字来表示有多少个字符是相同的。

SELECT SOUNDEX('Kennady') AS [SoundEx Kennady]
, SOUNDEX('Kary') AS [SoundEx Kary]
, DIFFERENCE ('Kennady', 'Kary') AS [Difference Kennady vs Kary]
, DIFFERENCE ('Kary', 'Kennady') AS [Difference Kary vs Kennady];

最佳答案

这是严格观察得出的。 documentation非常清楚:

The integer returned is the number of characters in the SOUNDEX values that are the same. The return value ranges from 0 through 4: 0 indicates weak or no similarity, and 4 indicates strong similarity or the same values.

根据本文档,返回值不应根据参数的顺序而有所不同。

根据我的查询:“Kennady”--> K530 和“Kary”--> K600。它们有两个共同字符,因此值应为 2。

现在,我注意到“Kenn”--> K500。将“Kennady”截断为“Kary”的长度会得到值“3”。嗯。

因此,我认为 DIFFERENCE() 使用第一个参数的长度来截断第二个参数。这使得参数的顺序很重要。将较长的参数放在前面。

我在其他一些字符串上尝试过这个。同样的模式似乎也有效。我没有找到任何文档来说明这种情况。

我想微软会将此称为“功能”而不是“错误”;)。

编辑:

以上推测并不完全正确。考虑以下因素

  • leepaupauld --> L114
  • 利奥波德 --> L143
  • lepaup --> L110

但是,

  • 差异(leepaupauld,leopold)= 4(!)
  • 差异(leopold,leepaupauld)= 3
  • 差异(leepaup,leopold)= 3(!)
  • 差异(leopold,leepaup)= 2

(!) 是我的判断,考虑到字符串的 soundex 值,结果根本没有意义。

所以,问题不在于长度。这是 @jpw 在评论中指出的底层方法。问题似乎是一个字符串中存在重复的匹配值。但是,根据文档,这些不应多次匹配相同的字符。

我的建议:使用编辑距离。这说得通。它在较长的琴弦上效果更好。这是理智的。它不是内置的,但很容易在网络上找到任何数据库的实现。

关于sql-server - 为什么当切换要比较的字符串顺序时,Difference 函数会给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40347930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com