SQL多表联合查询时如何采用字段模糊匹配(mysql中进行多表联查方式)学到了吗

随心笔谈9个月前发布 admin
183 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章介绍了如何在SQL中实现字段名称的模糊匹配,以解决由于字段名称细微差异导致的表关联问题。以下是文章的主要内容总结: ### 方法概述文章提出了多种方法来实现字段名称的模糊匹配: 1. **SQL模糊查询方法** - **MySQL**:使用`CONCAT`函数拼接占位符和字段值,并结合`LIKE`关键字进行匹配。 - **Oracle**:使用`||`拼接符并结合`LIKE`关键字。 - **SQL Server**:支持运算符拼接,并使用`INSTR`函数检测字符是否存在。 这些方法适用于常见的名称模糊匹配场景,如“城乡规划”与“城市规划”。 2. **更高级方法** - **NLP算法**:利用自然语言处理技术(如Word2Vec)进行文本相似度匹配,适用于更复杂的模糊情况。 - **手动处理**:对于复杂场景,可能需要结合逻辑规则或预定义映射表来处理。 ### 方法适用场景- **MySQL/Oracle/SQL Server**:适合大多数模糊匹配需求,尤其是字段名称差异较小时。需要根据数据库特性选择合适的拼接方式。- **NLP算法**:适用于需要高准确率的复杂模糊匹配,但需要额外开发和维护。- **手动处理**:适合小规模数据或特定场景,但效率较低。 ### 注意事项- **匹配准确性**:所有方法都可能漏网,建议结合业务需求和数据情况,选择和优化方法。- **开发效率**:手动处理建议减少工作量,提高开发效率。 总结而言,文章通过多种方法展示了实现字段名称模糊匹配的思路,适用于不同规模和复杂度的需求。



目录先说一下背景和要求方法一方法二方法三

背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容。

要求:实现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可视化展示》中已有详细说明,感兴趣的同学可以研究研究。

另外就是,不管哪种办法,总有漏网之鱼,也就是总有你匹配不到的情况,或是匹配错误的情况。所以还需要根据自己的需求、业务以及数据情况,具体问题具体分析,结合各种方法开发代码实现自己想要的功能,做到因地制宜。

那有同学又问了,就没有那种一招打天下的办法了吗?

有的。

你可以用你的最强大脑去手动处理~~~~~~~~~~

咳咳,我的意思是:就算要手动处理,我们也要减少手动处理的工作量嘛。要不“会急死人的”,真的“会急死人的”! 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:SQL Server模糊查询的常见方法总结SqlServer2016模糊匹配的三种方式及效率问题简析实现按关健字模糊查询,并按匹配度排序的SQL语句

© 版权声明

相关文章