MySQL中如何高效移除含重复数字的无效手机号数据行?
优化MySQL手机号过滤:移除重复数字过多的无效号码
嘿,我懂你现在的困扰——用NOT IN一个个枚举无效手机号实在太局限了,不仅写起来麻烦,还根本覆盖不完所有奇葩的垃圾号码(比如全2、全3,或者11100011100这种组合)。我给你几个更通用的优化方案,帮你一次性过滤掉这类重复数字过多的无效号码:
方案1:用正则排除全相同数字的号码
如果你的手机号是固定长度(比如国内常见的11位),可以用正则直接匹配所有数字完全相同的号码,不用一个个枚举:
WHERE C.`XBW-CELL-PHONE` NOT REGEXP '^([0-9])\\1{10}$'
- 解释:
^([0-9])匹配第一个数字,\\1{10}表示后面10个数字和第一个完全相同,也就是11位全重复的号码(比如11111111111、99999999999)。如果是10位手机号,把{10}改成{9}即可。
方案2:过滤只有少数几种数字的号码
很多垃圾手机号不是全重复,但只有2种数字组合(比如11111100000、00011100011),可以通过统计号码中不同数字的种类数来过滤:
WHERE ( (C.`XBW-CELL-PHONE` REGEXP '0') + (C.`XBW-CELL-PHONE` REGEXP '1') + (C.`XBW-CELL-PHONE` REGEXP '2') + (C.`XBW-CELL-PHONE` REGEXP '3') + (C.`XBW-CELL-PHONE` REGEXP '4') + (C.`XBW-CELL-PHONE` REGEXP '5') + (C.`XBW-CELL-PHONE` REGEXP '6') + (C.`XBW-CELL-PHONE` REGEXP '7') + (C.`XBW-CELL-PHONE` REGEXP '8') + (C.`XBW-CELL-PHONE` REGEXP '9') ) >= 3
- 解释:每个
REGEXP判断号码是否包含对应数字,结果会被转成1(包含)或0(不包含),相加后就是号码中不同数字的种类数。这里设置>=3,只保留至少有3种不同数字的号码,直接过滤掉只有1种或2种数字的垃圾号。
方案3:综合过滤(推荐)
把上面的规则和手机号合法性检查结合起来,比如先确保是纯数字、长度正确,再过滤重复数字过多的号码,甚至可以加上国内手机号的开头规则:
SELECT * FROM your_table C WHERE -- 确保是11位纯数字(根据你的实际长度调整) C.`XBW-CELL-PHONE` REGEXP '^[0-9]{11}$' -- 排除全相同数字的号码 AND C.`XBW-CELL-PHONE` NOT REGEXP '^([0-9])\\1{10}$' -- 排除只有2种及以下不同数字的号码 AND ( (C.`XBW-CELL-PHONE` REGEXP '0') + (C.`XBW-CELL-PHONE` REGEXP '1') + (C.`XBW-CELL-PHONE` REGEXP '2') + (C.`XBW-CELL-PHONE` REGEXP '3') + (C.`XBW-CELL-PHONE` REGEXP '4') + (C.`XBW-CELL-PHONE` REGEXP '5') + (C.`XBW-CELL-PHONE` REGEXP '6') + (C.`XBW-CELL-PHONE` REGEXP '7') + (C.`XBW-CELL-PHONE` REGEXP '8') + (C.`XBW-CELL-PHONE` REGEXP '9') ) >= 3 -- 可选:过滤国内合法手机号开头(13/14/15/16/17/18/19开头) AND C.`XBW-CELL-PHONE` REGEXP '^1[3-9][0-9]{9}$'
为什么比你原来的方案好?
你之前用NOT IN的方式只能覆盖你想到的几个特例,但垃圾号码的组合是无限的——比如全4、全5,或者11222222222这种,NOT IN根本列不完。上面的方案是规则化过滤,不管是什么数字的重复组合,只要符合“全重复”或“只有少数几种数字”的特征,都会被自动过滤掉,扩展性强得多。
内容的提问来源于stack exchange,提问作者sortinousn
相关产品推荐
相关产品推荐

