繁体   English   中英

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

[英]SQL - comparing strings from two tables (fuzzy match…sorta)

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

任何帮助深表感谢。 谢谢。

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

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

如果我理解,公司表中的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

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

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

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

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

然后,我会建议类似于以下内容:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM