SQL多表联合查询时采⽤字段模糊匹配
先说⼀下背景和要求:
背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发⽣变动,与现有数据有差别,但还是能勉强看明⽩数据内容。
要求:实现A表的名称字段和B表的名称字段要模糊匹配。
上图:
假如A表长这样:
B表长这样:
然后我要想变成这样:
简单说就是在我关联查询两表时,条件字段的取值看起来不⼀样,但是意思是⼀样的,应该要把这种数据关联起来。但是SQL⾥⾯“=”两边⼜必须严格相同,所以现在怎么办呢?
⽅法⼀:
可以采⽤类似于LIKE模糊查询的办法。
MySQL:
SELECT a.id,a.`name`,b.wname FROM z_good a,z_good_new b
WHERE INSTR(a.`name`,b.newname)>0 OR wname,a.`name`)>0
或者
SELECT a.id,a.`name`,b.wname FROM z_good a,z_good_new b
WHERE a.`name` LIKE CONCAT('%',b.newname,'%') wname LIKE CONCAT('%',a.`name`,'%')
Oracle:
json自动解析SELECT a.id,a.`name`,b.wname FROM z_good a,z_good_new b
WHERE a.`name` LIKE '%'||b.newname||'%'
mysql面试题sql语句多表联查SQL Server:
SELECT a.id,a.`name`,b.wname FROM z_good a,z_good_new b
WHERE a.`name` LIKE '%'+b.newname+'%' wname LIKE '%'+a.`name`+'%'
顺便说⼀下这⾥⽤到的字符串拼接功能在三类数据库中的写法:
SQL Server:avalonedit补全
SELECT '123'+'456'
Oracle:
网页素材先准备SELECT '123'||'456' FROM dualparameter estimation
或
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可视化展⽰》中已有详细说明,感兴趣的同学可以研究研究。
另外就是,不管哪种办法,总有漏⽹之鱼,也就是总有你匹配不到的情况,或是匹配错误的情况。所以还需要根据⾃⼰的需求、业务以及数据情况,具体问题具体分析,结合各种⽅法开发代码实现⾃⼰想要的功能,做到因地制宜。
那有同学⼜问了,就没有那种⼀招打天下的办法了吗?
有的。
⽅法三:
php7性能你可以⽤你的最强⼤脑去⼿动处理~~~~~~~~~~
咳咳,我的意思是:就算要⼿动处理,我们也要减少⼿动处理的⼯作量嘛。要不“会死⼈的”,真的“会死⼈的”!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论