如何使用%通配符实现字符串匹配 提取姓名部分匹配的表记录
问题描述
现有表A存储发件、收件人姓名信息,需要筛选出发件人和收件人姓名存在部分匹配(不需要完全一致)的记录,例如样例中id为ABC、DEF的条目,要求使用%通配符实现字符串模糊匹配。
样例表A数据
| id | 发件人全名 | 收件人名 | 收件人姓氏 |
|---|---|---|---|
| ABC | mike smith brown | mike | smith |
| DEF | kate josefin baker | kate | baker williams |
| GHI | kim jones | nathan | wilson |
实现方法
%是SQLLIKE语法里的通配符,能匹配0到任意长度的任意字符,把它拼在要匹配的内容前后,就能判断目标字符串里是否存在对应内容。
要筛出符合要求的记录,核心是满足两个条件:一是发件人全名里包含收件人名,二是发件人全名和收件人姓氏有重合内容。直接用下面的语句即可:
SELECT * FROM 表A WHERE 发件人全名 LIKE CONCAT('%', 收件人名, '%') AND ( 发件人全名 LIKE CONCAT('%', 收件人姓氏, '%') OR 收件人姓氏 LIKE CONCAT('%', SUBSTRING_INDEX(发件人全名, ' ', -1), '%') );
效果验证
- id=ABC:发件人全名里有收件人名
mike,也有收件人姓氏smith,命中规则被返回 - id=DEF:发件人全名里有收件人名
kate,发件人末尾的baker属于收件人双姓baker williams的一部分,命中规则被返回 - id=GHI:发件人全名里既没有收件人名
nathan,和收件人姓氏wilson也没有重合内容,被过滤
如果业务场景不需要处理多段姓氏的双向匹配,只需要判断发件人全名是否包含收件人填写的完整姓氏,可以直接把条件简化:
SELECT * FROM 表A WHERE 发件人全名 LIKE CONCAT('%', 收件人名, '%') AND 发件人全名 LIKE CONCAT('%', 收件人姓氏, '%');
内容的提问来源于stack exchange,提问作者user16462786
相关产品推荐
相关产品推荐

