MariaDB 10.6.20提取唯一非数字序列的SQL查询异常修复求助
修复后的MariaDB递归查询方案
要提取chars表phone字段中所有唯一的连续非数字序列,可通过调整递归CTE的正则匹配逻辑,确保每次提取连续的非数字块而非拆分后的片段:
WITH RECURSIVE cte AS ( -- 基础查询:提取每条记录的第一个连续非数字序列,及剩余待处理字符串 SELECT phone, REGEXP_SUBSTR(phone, '[^0-9]+', 1, 1) AS non_digit_seq, -- 移除已处理的非数字+数字部分,得到剩余字符串 REGEXP_REPLACE(phone, '^[^0-9]*[0-9]*', '') AS remaining_str FROM chars WHERE REGEXP_LIKE(phone, '[^0-9]') -- 仅处理包含非数字的记录 UNION ALL -- 递归查询:处理剩余字符串中的下一个连续非数字序列 SELECT phone, REGEXP_SUBSTR(remaining_str, '[^0-9]+', 1, 1) AS non_digit_seq, REGEXP_REPLACE(remaining_str, '^[^0-9]*[0-9]*', '') AS remaining_str FROM cte WHERE REGEXP_LIKE(remaining_str, '[^0-9]') -- 剩余字符串仍有非数字时继续递归 ) -- 去重后得到所有唯一非数字序列 SELECT DISTINCT non_digit_seq FROM cte WHERE non_digit_seq IS NOT NULL;
逻辑说明
- 正则匹配连续非数字块:用
[^0-9]+匹配一个或多个连续非数字字符,避免将同一连续序列拆分为多个片段(比如原问题中的") - "会被完整提取,而非拆成独立片段)。 - 递归处理剩余字符串:每次处理后,通过
REGEXP_REPLACE移除已处理的非数字块及后续的数字部分,确保下一轮递归只处理未解析的剩余内容。 - 去重结果:最后用
DISTINCT过滤重复的非数字序列。
示例数据测试
针对示例数据:
(555) 444 3322会提取出(、)+(1.400) - 200-4044 ext200会提取出+(,.,) -,-,ext
内容的提问来源于stack exchange,提问作者yenren
相关产品推荐
相关产品推荐

