【问题标题】:partial string matching in sqlsql中的部分字符串匹配
【发布时间】:2016-10-12 19:47:01
【问题描述】:

我需要根据它们共有的字符串数来匹配来自两个不同表的两列。所以例如在第一列我有:

================Table 1==============================
ID     desc             Year      Month
123    food_drink       2016      8
345    shoe_bag         2016      8
678    001_toilet_paper 2015      7
910    Bags_of_thing    2015      6

======================table 2======================
ID      Name           Year        month
ad      drink_server   2016        8 
ac      shoe_shiny     2016        8
aa      white_paper    2015        7
cc      blue_bags      2015        6

有没有办法通过在描述和名称中加入年、月和类似的字符串来组合这两个表。所以比较 desc 和 name 列,看看它们是否有 >= 5 个共同的字符串,然后:

===================================================
ID1  ID2  name          desc              Year  Month
123  ad   drink server  food_drink        2016   8
678  aa   white_paper   001_toilet_paper  2016   7

本质上,我需要一种方法来比较不同表的两列之间的公共字符串的数量。谢谢。

【问题讨论】:

  • 您可以编写任何您想要的join - 连接子句简单地归结为布尔值 true/false:true = 加入记录,false = 不加入。但是您的子字符串匹配不会很漂亮。 sql 不是一种用于进行任意字符串操作的好语言。最好将表标准化并将这些 food/drink/server/blah/blah 关键字放入它们自己的子表中,然后匹配将是微不足道的加入 + 平等测试。
  • 我不确定我是否理解。您想将 table1 中的每一行与 table2 中的每一行进行比较,以检查它们是否至少(或完全)有 5 个公共字段,或者您想将列与列进行比较?
  • 您使用的是哪个 DBMS?
  • 微软服务器管理工​​作室
  • 嗨。恐怕问题不清楚。你能以身作则吗?谢谢

标签: sql


【解决方案1】:

您的问题归结为您的数据甚至不是第一范式,因此很难在 SQL 中处理它。

这就是我要做的:

  • 创建一个将字段拆分为单词的临时表。我认为 ID 是两个表中的关键。表格如下所示:

    ================表字1============================= =

    ID1     word
    123    food
    123    drink
    345    shoe
    345    bag
    ...
    

=============表字2 =======================

    ID2      word
    ad      drink
    ad      server 
    ac      shoe
    ac      shiny
    ... 

现在您可以轻松找到有 5 个或更多相同单词的 ID:

SELECT ID1, ID2 FROM words1 JOIN words2 ON (word1.word = words2.word) 
GROUP by ID1, ID2
having count(*) >= 5;

获得 ID1 和 ID2 后,您可以连接回原始表并检索所需的其余数据。

【讨论】:

    【解决方案2】:

    感谢所有回答的人。我最终使用 R 来使用以下链接中描述的技术进行字符串匹配:

    https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2015-10-30
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2012-06-15
      • 2021-09-29
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多