我已经搜索了问题并且提出了类似的问题,但没有我认为可以使用的解决方案。这个问题类似于模糊匹配... 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
非常感谢任何帮助。谢谢。
答案 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, '%');
答案 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)
由于传入的数据格式不一致,我认为您无法使用数据库执行此操作。事实上,我建议不要使用数据库,允许您事先运行匹配的例程。
然后,您需要检查尽可能多的数据,并查看是否可以找到任何模式,或者您可以批量处理数据以使其更容易匹配。例如:
我会建议类似以下的内容:
我希望有一段时间,你可能应该举起低信任的比赛,让人们对他们进行评论,同时调整你的过程。
您还可以存储公司以前的所有匹配项,这意味着随着时间的推移您的系统可能会变得更好。这取决于每天数据的变化程度。