SQL SELECT查询如何排除指定列含N个连续重复字符的行
正确实现方案
问题根因
你原来的写法存在两个核心问题:
- 正则匹配逻辑错误:
(.)\1{5,}匹配的是至少6个连续相同字符,而你要求的是存在5个连续就排除,匹配阈值设置错误 - 反斜杠转义问题:多数SQL环境下反斜杠本身就是转义字符,直接写
\1会被解析为转义序列而非反向引用,需要双写反斜杠生效
通用正则逻辑
要匹配「存在N个连续重复字符」,正则通用格式为(.)\\1{N-1,},你这里N=5,对应正则就是(.)\\1{4,}
不同数据库的实现写法
MySQL/MariaDB
SELECT * FROM mytable WHERE NOT (mycolumn REGEXP '(.)\\1{4,}');
如果是MySQL 8.0+开启了NO_BACKSLASH_ESCAPES的sql_mode,不需要额外转义反斜杠:
SELECT * FROM mytable WHERE NOT (mycolumn REGEXP '(.)\1{4,}');
PostgreSQL
PostgreSQL用~操作符做正则匹配,反向引用不需要额外转义:
SELECT * FROM mytable WHERE NOT (mycolumn ~ '(.)\1{4,}');
SQL Server 2017+
SELECT * FROM mytable WHERE NOT REGEXP_LIKE(mycolumn, '(.)\1{4,}');
匹配效果验证
上述写法可以完全符合你的示例要求:
- 排除行:
'0000011114BR13471'(前5个0连续)、'554XXXXXXXXXXXXXX'(多个X连续)、'000111114BR134716'(5个1连续)等所有存在5个及以上连续重复字符的行 - 保留行:
'000011114BR134716'(最多4个0/4个1连续)、'12345678901200001'(最多4个0连续)等无5个连续重复字符的行
内容的提问来源于stack exchange,提问作者Vojtech
相关产品推荐
相关产品推荐

