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

Oracle中REGEXP_REPLACE为何将所有数字替换为同一数值?

解决Oracle中地址字符串多数字段单独反转问题

问题原因

你的查询里,REGEXP_SUBSTR仅提取第一个匹配的数字段(示例中的27),反转后得到72,随后REGEXP_REPLACE用该值替换所有数字段,导致所有数字都变成72,不符合每个数字单独反转的需求。

解决方案

方法1:自定义反转函数

先创建一个用于反转字符串的函数:

CREATE OR REPLACE FUNCTION REVERSE_STR(p_str VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  RETURN REVERSE(p_str);
END;
/

随后在REGEXP_REPLACE中调用该函数,通过反向引用传递每个匹配的数字段,实现单独反转:

SELECT REGEXP_REPLACE(
         'Rachel Street 27, Floor 42',
         '(\d+)',
         REVERSE_STR('\1')
       ) AS corrected_address
FROM dual;

执行后会对每个数字段单独反转,得到结果:Rachel Street 72, Floor 24

方法2:无函数递归拆分处理

如果无法创建自定义函数,可通过递归CTE拆分字符串,处理后再拼接:

WITH addr_parts AS (
  SELECT
    REGEXP_SUBSTR('Rachel Street 27, Floor 42', '[^0-9]+|\d+', 1, LEVEL) AS part,
    LEVEL AS pos
  FROM dual
  CONNECT BY REGEXP_SUBSTR('Rachel Street 27, Floor 42', '[^0-9]+|\d+', 1, LEVEL) IS NOT NULL
),
processed_parts AS (
  SELECT
    CASE
      WHEN part REGEXP '^\d+$' THEN REVERSE(part)
      ELSE part
    END AS processed_part,
    pos
  FROM addr_parts
)
SELECT LISTAGG(processed_part, '') WITHIN GROUP (ORDER BY pos) AS corrected_address
FROM processed_parts;

该方法先将地址拆分为非数字段和数字段,对数字段单独反转后重新拼接,得到同样的正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:19:51