SQL多表联合查询时如何采用字段模糊匹配
先说一下背景和要求
背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容。
要求:实现A表的名称字段和B表的名称字段要模糊匹配。
上图:
假如A表长这样:
B表长这样:
然后我要想变成这样:
简单说就是在我关联查询两表时,条件字段的取值看起来不一样,但是意思是一样的,应该要把这种数据关联起来。但是SQL里面“=”两边又必须严格相同,所以现在怎么办呢?
方法一
可以采用类似于LIKE模糊查询的办法。
MySQL:
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new b WHERE INSTR(a.`name`,b.newname)>0 OR INSTR(b.newname,a.`name`)>0
或者
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new b WHERE a.`name` LIKE CONCAT('%',b.newname,'%') OR b.newname LIKE CONCAT('%',a.`name`,'%')
Oracle:
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new b WHERE a.`name` LIKE '%'||b.newname||'%'
SQL Server:
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new b WHERE a.`name` LIKE '%'+b.newname+'%' OR b.newname LIKE '%'+a.`name`+'%'
顺便说一下这里用到的字符串拼接功能在三类数据库中的写法:
SQL Server:
SELECT '123'+'456'
Oracle:
SELECT '123'||'456' FROM dual 或 SELECT CONCAT('123','456') FROM dual
MySQL:
SELECT CONCAT('123','456')
Oracle和MySQL中虽然都有CONCAT,但是Oracle中只能拼接2个字符串,所以建议用||的方式,MySQL中的CONCAT则可以拼接多个字符串。
此外,MySQL中的INSTR(STR,SUBSTR)函数,在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX)。
- STR—被搜索的字符串;
- SUBSTR—希望搜索的字符串;
结论:在字符串STR里面,字符串SUBSTR出现的第一个位置(INDEX),INDEX是从1开始计算,如果没有找到就直接返回0,没有返回负数的情况。
到这儿,有同学就会发现,你这应用场景也太单一了吧,要是这种:A表被关联字段值为“城乡规划”,B表被关联字段值为“城市规划”;或者A表被关联字段值为“漂亮”,B表被关联字段值为“美丽”。这样的两个字段值也是一个意思,但是用上面的方法就行不通了。
没办法了嘛?
有的。
方法二
你还可以使用NLP的算法来做上面最后提到的那种情况,关于这点,在我之前发表的文章《Word2Vec可视化展示》中已有详细说明,感兴趣的同学可以研究研究。
另外就是,不管哪种办法,总有漏网之鱼,也就是总有你匹配不到的情况,或是匹配错误的情况。所以还需要根据自己的需求、业务以及数据情况,具体问题具体分析,结合各种方法开发代码实现自己想要的功能,做到因地制宜。
那有同学又问了,就没有那种一招打天下的办法了吗?
有的。
方法三
你可以用你的最强大脑去手动处理~~~~~~~~~~
咳咳,我的意思是:就算要手动处理,我们也要减少手动处理的工作量嘛。要不“会急死人的”,真的“会急死人的”!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Windows 11安装SQL Server 2019出现"等待数据库引擎恢复句
这篇文章主要介绍了Windows 11安装SQL Server 2019出现"等待数据库引擎恢复句柄失败"问题完美解决方案,解决方案很简单,格式化您的硬盘,删除分区并重新指定扇区大小,本文给大家介绍的非常详细,需要的朋友参考下吧2023-07-07SQL Server误区30日谈 第12天 TempDB的文件数和需要和CPU数目保持一致
TempDB的文件没有必要分布在多个存储器之间。如果你看到PAGELATCH类型的等待,即使你进行了分布也不会改善性能,而如果PAGEIOLATCH型的等待,或许你需要多个存储器,但这也不是必然-有可能你需要讲整个TempDB迁移到另一个存储系统,而不是仅仅为TempDB增加一个文件2013-01-01SQL Server中的集合运算: UNION, EXCEPT和INTERSECT示例代码详解
这篇文章主要介绍了SQL Server中的集合运算: UNION, EXCEPT和INTERSECT,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法
今天在评审接手的项目中的存储过程时,发现存在大量的在条件里判断变量是否NULL的写法2013-09-09
最新评论