SQL Server如何判断手机号列是否存在同一数字重复超7次的无效值
SQL Server 电话号码连续重复数字校验实现
核心逻辑
我们需要判断电话号码字符串中是否存在同一个数字连续出现≥8次(即超过7次)的情况,命中则返回INVALID,否则判定为有效。该逻辑兼容带括号、空格、横杠等特殊格式的电话号码,无需提前清洗特殊字符。
实现方案
方案1:查询时实时校验(兼容所有SQL Server版本)
直接使用PATINDEX函数匹配连续重复数字:
SELECT phone_num AS 电话号码, CASE WHEN PATINDEX('%00000000%', phone_num) > 0 OR PATINDEX('%11111111%', phone_num) > 0 OR PATINDEX('%22222222%', phone_num) > 0 OR PATINDEX('%33333333%', phone_num) > 0 OR PATINDEX('%44444444%', phone_num) > 0 OR PATINDEX('%55555555%', phone_num) > 0 OR PATINDEX('%66666666%', phone_num) > 0 OR PATINDEX('%77777777%', phone_num) > 0 OR PATINDEX('%88888888%', phone_num) > 0 OR PATINDEX('%99999999%', phone_num) > 0 THEN 'INVALID' ELSE '有效' END AS 校验结果 FROM your_table;
规则调整说明:如果你的要求是连续重复7次就算无效,把上面每个模式里的数字个数从8改为7即可,匹配你给出的
(401) 4444444命中无效的示例。
方案2:表级校验约束(禁止无效数据入库)
如果需要从入库层面限制无效数据,可以给表增加校验约束:
ALTER TABLE your_table ADD CONSTRAINT CK_ValidatePhoneRepeatDigit CHECK ( PATINDEX('%00000000%', phone_num) = 0 AND PATINDEX('%11111111%', phone_num) = 0 AND PATINDEX('%22222222%', phone_num) = 0 AND PATINDEX('%33333333%', phone_num) = 0 AND PATINDEX('%44444444%', phone_num) = 0 AND PATINDEX('%55555555%', phone_num) = 0 AND PATINDEX('%66666666%', phone_num) = 0 AND PATINDEX('%77777777%', phone_num) = 0 AND PATINDEX('%88888888%', phone_num) = 0 AND PATINDEX('%99999999%', phone_num) = 0 );
方案3:简洁写法(仅支持SQL Server 2017及以上版本)
用REPLICATE生成重复数字模式,避免写10次重复判断:
SELECT phone_num AS 电话号码, CASE WHEN EXISTS( SELECT 1 FROM (VALUES('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')) t(digit) WHERE PATINDEX('%' + REPLICATE(t.digit, 8) + '%', phone_num) > 0 ) THEN 'INVALID' ELSE '有效' END AS 校验结果 FROM your_table;
内容的提问来源于stack exchange,提问作者mba026
相关产品推荐
相关产品推荐

