有没有办法在不知道值的情况下找出 SQL 服务器中的两个字符串是否相似?

Is there a way to find out if two strings are similar in SQL Server without knowing anything about the values?

我正在尝试将基于主要项目的相关项目放在一起。

例如,假设我有一个非常简单的 [FRUIT] table:

ID NAME
1 Fuji Apples
2 Apple: Golden Delicious
3 Granny Smith Apple
4 Blood Orange
5 Orange: Mandarin

并且用户当前正在查看“富士苹果”。我想 return“Apple:Golden Delicious”和“Granny Smith Apple”的行,因为它们的 [Name] 的值中也有“Apple”一词柱子。我想我正在寻找的是类似 LIKE 的东西,它对字符串进行更广泛的比较以查看是否有任何相似的字符集。


我看过 SOUNDEXDIFFERENCE,但它们不是我想要的因为我的字符串太长,相似的词可能在字符串中的任何地方。

如果没有什么可以的话,如果需要的话,我总是可以实现一些相似度算法;但如果 t-sql.

已经内置,我不想付出努力

注意: 我知道在上面的示例中,添加另一列 and/or table 具有值“Apple”会更有意义”和“橙色”;但这不是我要问的。

请尝试以下解决方案。

它正在使用 XML、XQuery 和量化表达式。

有用link:Quantified Expressions (XQuery)

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE  (ID INT IDENTITY(1,1) PRIMARY KEY, fruit VARCHAR(200));
INSERT INTO @tbl (fruit) VALUES
('Fuji Apples'),
('Apple: Golden Delicious'),
('Granny Smith Apple'),
('Blood Orange'),
('Orange: Mandarin');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = SPACE(1)
    , @searchFor VARCHAR(30) = 'Fuji Apple';

SELECT t.*
    , c.value('some $r in /root/source/r/text()
                satisfies contains(data(/root/target)[1], $r)', 'BIT') AS Result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><source><r><![CDATA[' + REPLACE(@searchFor, @Separator, ']]></r><r><![CDATA[') + ']]></r></source>'
      + '<target><r><![CDATA[' + REPLACE(fruit, @Separator, ']]></r><r><![CDATA[') + ']]></r></target></root>' AS XML)
      ) AS t1(c);

输出

+----+-------------------------+--------+
| ID |          fruit          | Result |
+----+-------------------------+--------+
|  1 | Fuji Apples             |      1 |
|  2 | Apple: Golden Delicious |      1 |
|  3 | Granny Smith Apple      |      1 |
|  4 | Blood Orange            |      0 |
|  5 | Orange: Mandarin        |      0 |
+----+-------------------------+--------+