【问题标题】:Is there a way to find out if two strings are similar in SQL Server without knowing anything about the values?有没有办法在不知道值的情况下找出 SQL Server 中的两个字符串是否相似?
【发布时间】:2022-01-28 05:17:39
【问题描述】:

我正在尝试根据主要项目来组合一些相关项目。

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

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

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


我查看了 SOUNDEXDIFFERENCE,但它们不是我想要的,因为我的字符串太长了,类似的词可能位于字符串中的任何位置。

如果没有什么问题,如果需要,我总是可以实现一些相似性算法;但如果 t-sql 已经内置,我不想付出努力。

注意:我知道在上面的示例中,只添加另一个具有“Apple”和“Orange”值的列和/或表会更有意义;但这不是我要问的。

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
  • 听起来你应该有一个“关键字”表,然后是一个连接表来链接你上面的数据和你的关键字。然后,您可以返回共享 1 个或多个关键字的任何其他行。
  • 全文搜索结合semanticsimilaritytable可能会得到你想要的,请参阅docs.microsoft.com/en-us/sql/relational-databases/…

标签: sql sql-server database tsql sql-server-2012


【解决方案1】:

请尝试以下解决方案。

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

有用的链接: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 |
+----+-------------------------+--------+

【讨论】:

  • 不能 100% 满足我的需求,但却是完美的起点。谢谢!
猜你喜欢
  • 2021-03-26
  • 2012-01-18
  • 2020-10-12
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多