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

Oracle SQL中使用REGEXP_REPLACE统计标识数量的问题求助

问题原因分析

  1. 统计对象错误:你当前的regexp_count直接统计原始sign_number字段的空格数,而非替换处理后的结果,这是导致id=485764这类数据统计错误的核心原因。
  2. 正则匹配失效:Oracle正则表达式中,斜杠/不属于特殊字符,无需转义,原正则里的N\/A无法匹配实际数据中的N/A,导致N/A未被正确替换。
  3. 统计逻辑缺陷:即使替换正确,直接统计空格数也不准确——有效标识数量应为处理后字符串的空格数+1(处理后非空时),同时需完全排除N/A的干扰。

正确实现方案

方案一:分步清洗后统计

通过先移除N/A、统一分隔符、清理多余空格,再计算有效标识数量:

SELECT 
    id,
    sign_number,
    -- 可选:查看清洗后的中间结果
    TRIM(REGEXP_REPLACE(REGEXP_REPLACE(sign_number, '\s*N/A\s*', ' '), '[;,:]+', ' ')) AS cleaned_signs,
    -- 计算有效标识数量
    CASE 
        WHEN TRIM(REGEXP_REPLACE(REGEXP_REPLACE(sign_number, '\s*N/A\s*', ' '), '[;,:]+', ' ')) = '' THEN 0
        ELSE REGEXP_COUNT(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(sign_number, '\s*N/A\s*', ' '), '[;,:]+', ' ')), '\s') + 1
    END AS count
FROM your_table_name;

方案二:简化正则直接统计

用单个正则完成清洗,再计算数量:

SELECT 
    id,
    sign_number,
    CASE 
        WHEN TRIM(REGEXP_REPLACE(sign_number, '(\s*N/A\s*)|[;,:]+', ' ')) = '' THEN 0
        ELSE REGEXP_COUNT(TRIM(REGEXP_REPLACE(sign_number, '(\s*N/A\s*)|[;,:]+', ' ')), '\s') + 1
    END AS count
FROM your_table_name;

方案三:直接匹配有效标识(更精准)

如果有效标识仅由字母/数字组成,可直接匹配符合规则的标识并统计次数,自动排除N/A:

SELECT 
    id,
    sign_number,
    REGEXP_COUNT(sign_number, '[A-Z0-9]+(?![^;,:\s])') AS count
FROM your_table_name;

测试验证

以上方案均能输出你期望的结果:

idcount
1038540
1035841
1348515
1258432
1584347
4857642

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:22:47