You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 正则匹配连续非数字块:用[^0-9]+匹配一个或多个连续非数字字符,避免将同一连续序列拆分为多个片段(比如原问题中的") - "会被完整提取,而非拆成独立片段)。
  2. 递归处理剩余字符串:每次处理后,通过REGEXP_REPLACE移除已处理的非数字块及后续的数字部分,确保下一轮递归只处理未解析的剩余内容。
  3. 去重结果:最后用DISTINCT过滤重复的非数字序列。

示例数据测试

针对示例数据:

  • (555) 444 3322 会提取出 (、)
  • +(1.400) - 200-4044 ext200 会提取出 +(, ., ) - , - , ext

内容的提问来源于stack exchange,提问作者yenren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:43:20