有没有办法在不知道值的情况下找出 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 的东西,它对字符串进行更广泛的比较以查看是否有任何相似的字符集。
我看过 SOUNDEX 和 DIFFERENCE,但它们不是我想要的因为我的字符串太长,相似的词可能在字符串中的任何地方。
如果没有什么可以的话,如果需要的话,我总是可以实现一些相似度算法;但如果 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 |
+----+-------------------------+--------+
我正在尝试将基于主要项目的相关项目放在一起。
例如,假设我有一个非常简单的 [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 的东西,它对字符串进行更广泛的比较以查看是否有任何相似的字符集。
我看过 SOUNDEX 和 DIFFERENCE,但它们不是我想要的因为我的字符串太长,相似的词可能在字符串中的任何地方。
如果没有什么可以的话,如果需要的话,我总是可以实现一些相似度算法;但如果 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 |
+----+-------------------------+--------+