SQL - 比较两个表中的字符串(模糊匹配... sorta)

时间:2014-03-06 05:15:46

标签: sql string reference match fuzzy-search

我已经搜索了问题并且提出了类似的问题,但没有我认为可以使用的解决方案。这个问题类似于模糊匹配... sorta。比较两个表我需要帮助。一个表是公司参考表,另一个表是获取每天导入其中的原始公司数据的表。参考表是干净的,并且具有与每个公司相关联的公司ID。导入的每日数据没有公司ID。我要做的是将每日数据引用到company_name上的“公司参考表”,并根据company_name更新'Company Table的列company_state。不幸的是,每天进入的company_name的每日数据字符串并不总是相同。在实际的公司名称前面或后面可以有各种字符(a-z,0-9,+, - ,。)和空格,每天都有不同的长度,所以我不相信我可以用charindex来清理它。

公司参考表

company_id  company_name  company_state
1           Awesome Inc   NY
2           Excel-guru    AL
3           Clean All     MI 

公司表

company_name              company_state
abc123 Awesome   Inc      NULL
Excel gur xyz-987         NULL
Clean All Cleanall        NULL

我想要它做的是这个。 Sorta就像模糊匹配一样。

公司表

company_name              company_state
abc123 Awesome   Inc      NY
Excel gur xyz-987         AL
Clean All Cleanall        MI

非常感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

请尝试以下查询来更新公司表:

update company c INNER JOIN company_ref cr
ON c.company_name LIKE concat('%', cr.company_name, '%') 
SET c.company_state = cr.company_state;

另一种方法是使用 SELECT

SELECT c.*, cr.* FROM company c INNER JOIN company_ref cr
ON c.company_name LIKE concat('%', cr.company_name, '%');

SQL小提琴:http://sqlfiddle.com/#!2/ec76f/1

答案 1 :(得分:0)

如果我理解,公司表中的company_name总是包含引用表中的整个字符串 - 它可能在该字符串之前或之后包含一些垃圾。如果是这样,你只需要为你的DBMS找到一个合适的字符串函数,让你检查字符串A是否包含字符串B.例如,使用MySQL我认为以下内容可以工作(未经测试):

select c.company_name, r.company_state from company_table c, reference_table r where locate(r.company_name, c.company_name) != 0

这是有效的,因为MySQL locate(A, B)函数返回0当且仅当字符串A没有出现在字符串B中时。

答案 2 :(得分:0)

由于传入的数据格式不一致,我认为您无法使用数据库执行此操作。事实上,我建议不要使用数据库,允许您事先运行匹配的例程。

然后,您需要检查尽可能多的数据,并查看是否可以找到任何模式,或者您可以批量处理数据以使其更容易匹配。例如:

  • 删除重复的空格(例如“Awesome Inc” - >“Awesome Inc”)
  • 删除非字母数字字符
  • 如果可能,您可以删除明显的代码吗?

我会建议类似以下的内容:

  • 在公司表中添加一个字段(传入数据)以指示匹配的公司,允许您跟踪匹配的项目(并进一步用于连接)。如果您不想修改此表,请添加第二个表以链接这两个表。
  • 重复尝试匹配,从最明确的版本开始(例如,公司表中的状态存在且状态匹配公司表名称中的公司参考名称) - 存储这些关联。它们会减少您下次尝试时可能的匹配。在您的匹配返回的任何时候> 1种可能性,不应该使用。
  • 当您消除了简单匹配后,您可以继续使用更加模糊的方法,例如Levenshtein Distance,匹配单个词(令牌)。

我希望有一段时间,你可能应该举起低信任的比赛,让人们对他们进行评论,同时调整你的过程。

您还可以存储公司以前的所有匹配项,这意味着随着时间的推移您的系统可能会变得更好。这取决于每天数据的变化程度。