ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

数据库(SQL)两表关联字段模糊

2021-07-08 16:35:15  阅读:374  来源: 互联网

标签:good name 两表 处理 数据库 手动 mc SQL 数据


最近发现一个比较恶心的问题,由于业务或是其他不可说的原因(各位读者自行脑补)的问题导致原有存储的数据发生变动;与现有数据有差别,如原有的数据名称发生变动,但是还要对数据进行匹配(,此时你的内心如羊驼狂奔而过,唉,还是要处理的呀),来看数据,

先介绍一下表,

原表名/新表名 字段名及其解释 注释
z_good
列名 类型 解释
id varchar(50) id,主键id
name varchar(255) 名称
remark varchar(255) 备注或描述
newmc varchar(255) 新名称

 

旧表
z_good_new
类型 解释
newid varchar(50) id,主键id
mc varchar(255) 名称
ms varchar(255) 描述
新表

旧表,z_good,数据、条数只是事例

 

新表,z_good_new,数据、条数只是事例

 

 发现什么没有,z_good的name列与z_good_new的mc列的数据相似,但是不完全一致(只有名称是类似的,上图的数据是我列举的,事实的备注也是不一致的)。这就是我上面说的名字发生了变动,需求是要把新名字放到旧表的newmc列中(也就是z_good_new的mc列 一 一对应到newmc列,前提肯定是相似的才能放入了)

 有人说我手动处理,我感觉你疯了(),这只是列举的10条数据,当然可以手动处理。如果两表各有1万条数据呢、10万条呢、100万条呢  你还手动处理,你疯了吧,没发烧吧怎么开始说胡话了()手动处理,到你挂的时候你能处理完就不错了()!

所以,办法来了,两表关联查询,你会这么写

,完蛋,只有一条数据匹配到了,其他的都报废了。你可能会说:没办法了,剩下的手动处理吧。手动处理你就废了,彻底废了。原因就出在b.mc=a.name,因为数据是严格匹配的,例如"2020怒晴湘西"和"怒晴湘西"从数据层面看确实不是一个东西,但是人为处理知道这两个数据是一回事,更何况"2020怒晴湘西"他本身和"怒晴湘西"就是一回事,只是换了个名字升级了,那我怎样处理才能让让他更多的匹配到,减少手动处理的工作量呢

别慌,稳住。看完我这个或许还有救,就算要手动处理,我们也要减少手动处理的工作量,要不“会死人的”,真的“会死人的”

mysql的处理办法:

sql:

select a.id,a.`name`,b.newid,b.mc
from z_good a
left join z_good_new b on instr(a.`name`,b.mc)>0

发现没有匹配到的数据变多了,只有少部分的数据没有匹配到,这是时候再手动处理。发现了吧这次没写on b.mc=a.name而是on instr(a.`name`,b.mc)>0。

 

MySql的instr函数:

INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX); 
STR 被搜索的字符串 
SUBSTR 希望搜索的字符串 
结论:在字符串STR里面,字符串SUBSTR出现的第一个位置(INDEX),INDEX是从1开始计算,如果没有找到就直接返回0,没有返回负数的情况。

关于MySql的instr函数的解释太多了,一百度一大堆,我就不做解释了。

 

SQLserver

 /**两个表 字段模糊匹配**//**使用like进行查询 如何进行匹配**/

    select * from table_A a,table_B b where b.name like convert(nvarchar(200),'%'+a.name +'%')      ——这个没试过,网上看到的,看情况应该是可以的。

 

PGSQL

sql:

select a.id,a.name,b.newid,b.mc
from z_good a
left join z_good_new b on a.name like ('%'||b.mc||'%');
把没有匹配的也展示出来了,看到没有匹配的数据只是少部分,那就只能手动处理了,最起码比原来好多了

 

 

 

 

 

 

sql:

select a.id,a.name,b.newid,b.mc
from z_good a,z_good_new b
where a.name like ('%'||b.mc||'%');
只展示了相互匹配到的数据,与inner join效果一致。没有匹配的数据去原数据表查看,结果只是少部分。那就手动处理,最起码比原来好多了

 

 

 

 

 


其他数据库一般都有自己的函数或者写法那要自己找下了。具体sql怎么写,还要看先下数据、分析下,从中找出手动处理数据最少的SQL来执行。好了就是这样了!

 

标签:good,name,两表,处理,数据库,手动,mc,SQL,数据
来源: https://www.cnblogs.com/bkyqtr/p/14985868.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有