SQL多表联合查询时如何采用字段模糊匹配
背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容。
要求:实现A表的名称字段和B表的名称字段要模糊匹配。
上图:
假如A表长这样:
B表长这样:
然后我要想变成这样:
简单说就是在我关联查询两表时,条件字段的取值看起来不一样,但是意思是一样的,应该要把这种数据关联起来。但是SQL里面 = 两边又必须严格相同,所以现在怎么办呢?
[var]可以采用类似于LIKE模糊查询的办法。
MySQL:
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new bWHERE 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 bWHERE 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 bWHERE a.`name` LIKE % ||b.newname|| %
SQL Server:
SELECT a.id,a.`name`,b.newid,b.newname FROM z_good a,z_good_new bWHERE a.`name` LIKE % +b.newname+ % OR b.newname LIKE % +a.`name`+ %
顺便说一下这里用到的字符串拼接功能在三类数据库中的写法:
SQL Server:
SELECT 123 + 456Oracle:
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表被关联字段值为 美丽 。这样的两个字段值也是一个意思,但是用上面的方法就行不通了。
没办法了嘛?
有的。
[var]你还可以使用NLP的算法来做上面最后提到的那种情况,关于这点,在我之前发表的文章《Word2Vec可视化展示》中已有详细说明,感兴趣的同学可以研究研究。
另外就是,不管哪种办法,总有漏网之鱼,也就是总有你匹配不到的情况,或是匹配错误的情况。所以还需要根据自己的需求、业务以及数据情况,具体问题具体分析,结合各种方法开发代码实现自己想要的功能,做到因地制宜。
那有同学又问了,就没有那种一招打天下的办法了吗?
有的。
[var]你可以用你的最强大脑去手动处理~~~~~~~~~~
咳咳,我的意思是:就算要手动处理,我们也要减少手动处理的工作量嘛。要不 会急死人的 ,真的 会急死人的 !
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 SQL多表联合查询时如何采用字段模糊匹配
相关文章
- mysql如何优化慢查询_慢sql优化思路
- PyQt5数据库开发1 4.1 SQL Server 2008 R2如何开启数据库的远程连接
- SQL开发知识:Oracle字段根据逗号如何分割查询数据的方法
- MySQL动态SQL:实现动态查询的高效方式。(mysql动态sql)
- Oracle 视图 V$SQL_WORKAREA_HISTOGRAM 官方解释,作用,如何使用详细说明
- ABAP 7.40, SP08 中的 Open SQL 新特性详解编程语言
- 查询 MySQL查询:从SQL语句中构建你的查询(sql语句mysql)
- MongoDB导出SQL: 一种简单快捷的方式(mongodb导出sql)
- Oracle如何实现动态执行SQL语句?(oracle动态执行)
- 「MySQL 教程」学习如何拼接 SQL 语句,让你的操作更灵活高效(mysql拼接sql语句)
- Oracle SQL查询前一天的数据(oracle前一天sql)
- 如何在Linux上导入SQL文件:操作简单易学(linux导入sql文件)
- 如何使用 MySQL 导入 SQL 文件?(mysql导入sql文件)
- 快速上手:如何打开MySQL SQL命令行界面?(mysql打开sql)
- SQL Server查询:如何处理锁表问题(sqlserver查询锁表)
- 字段SQL Server中如何查询空值字段(sqlserver查空)
- 查询使用MSSQL对多表进行复杂SQL查询(sql mssql 多表)
- Oracle SQL跟踪:如何优化数据库性能?(oracle跟踪sql)
- Oracle数据库如何写复杂SQL语句?(oracle复杂sql)
- MySQL SQL调优技巧提高数据库性能(mysql中sql调优)
- Redis缓存的SQL优化技术(sql缓存redis机制)
- 查询Oracle中SQL语句查看显示报表(oracle中sql显示)
- Oracle SQL不容忽视的不为空判断(oracle不为空sql)
- Sql学习第一天——SQL练习题(建表/sql语句)