SQL Server中校验有效电话号码 匹配语句不生效问题排查
问题根因
你的查询无法返回预期结果,核心问题有两个:
- 标准SQL的
LIKE操作符不支持正则语法,仅支持%(匹配任意长度任意字符)、_(匹配单个任意字符)两类通配符,你写的{3}、\s这类正则标记在LIKE逻辑中会被当做普通字符匹配,完全不生效。 - 你写的匹配规则既没有覆盖全部合法号码格式,也没有对齐你定义的两条无效号码判定规则。
正确实现逻辑
校验号码需要同时满足两个要求,完全匹配你给出的判定规则:
- 剔除号码中所有非数字字符后,纯数字部分长度恰好为10位
- 号码中仅允许出现数字、
(、)、-,以及开头可选的+(对应样例中带国家码的合法格式),不能包含字母或其余特殊字符
可用查询语句
不同数据库的正则匹配语法略有差异,以下是最常用的MySQL环境写法:
SELECT PhoneNumber FROM Customers WHERE -- 校验字符合法性,仅允许出现规定范围内的字符 PhoneNumber REGEXP '^\\+?[0-9()\\-]+$' -- 校验纯数字长度刚好为10位 AND LENGTH(REGEXP_REPLACE(PhoneNumber, '[^0-9]', '')) = 10;
如果使用PostgreSQL,调整正则匹配写法即可:
SELECT PhoneNumber FROM Customers WHERE PhoneNumber ~ '^\+?[0-9()\-]+$' AND LENGTH(REGEXP_REPLACE(PhoneNumber, '[^0-9]', '', 'g')) = 10;
样例匹配说明
针对你给出的测试数据:
+1(111)11-1111:仅包含合法字符,剔除非数字后纯数字长度为10,判定合规1111111111:纯数字长度10,判定合规11(11)111111:若按你给出的书面规则,该号码仅含数字和()、纯数字长度10,属于合规号码;如果该号码需要被判定为无效,需要补充格式规则(例如括号内必须为3位数字)11abcd1111:包含字母,判定为无效
内容的提问来源于stack exchange,提问作者Rnue
相关产品推荐
相关产品推荐

