SQL如何正确比对两张表中格式不同(含/不含-)的电话号码字段
现有SQL的问题
你写的语句存在3个核心错误,无法得到正确结果:
- 主查询的MAJ表没有定义别名
A,子查询里直接引用A.notel会触发别名不存在的语法报错 - 两表手机号格式未做统一处理,带
-分隔符的格式和纯数字格式直接做等值判断,永远无法命中匹配 - 末尾的
SUBSTR('notel', 7,5)属于完全无效的逻辑:一是给字段名加了单引号,数据库会把它识别为字符串常量而非表字段;二是该片段没有搭配任何判断运算符,本身不具备任何筛选作用
正确比对方案
核心思路是先统一两表待比对字段的格式,再做等值匹配。由于MAJ表的手机号本身不带-,只需要把user表notel字段里的所有-符号移除,就能和MAJ表的手机号格式完全对齐。
基础可用写法如下:
SELECT * FROM MAJ A WHERE EXISTS ( SELECT 1 FROM user B WHERE A.notel = REPLACE(B.notel, '-', '') );
如果需要更高的容错性(比如担心某张表的手机号混入空格、括号等其他特殊符号),可以对两边的字段都做清洗,只保留数字内容后再比对,通用写法参考:
SELECT * FROM MAJ A WHERE EXISTS ( SELECT 1 FROM user B WHERE REGEXP_REPLACE(A.notel, '[^0-9]', '') = REGEXP_REPLACE(B.notel, '[^0-9]', '') );
说明:
REGEXP_REPLACE是MySQL8.0+、PostgreSQL、Oracle等主流数据库都支持的正则替换函数,如果使用低版本MySQL不支持正则,可以嵌套多层REPLACE函数,把横杠、空格、括号等常见特殊符号逐一替换为空即可。
内容的提问来源于stack exchange,提问作者nerdgirl
相关产品推荐
相关产品推荐

