Oracle SQL REGEXP 用不同的列值替换特定字符串

Oracle SQL REGEXP to replace a particular string with different column value

我在 ColumnA 中有一个字符串值,用“_”分隔。

ColumnA ColumnB
1_2_AB34-E1 8
2_3_CD56-F1 9

我需要修改 ColumnA,将第二个“_”之后的值替换为 ColumnB 中的值

ColumnA ColumnB
1_2_8 8
2_3_9 9

我尝试使用 REGEXP_REPLACE(ColumnA, '[^|]+', ColumnB, 1, 3)。但它没有按预期工作。有人可以分享他们的意见吗?

您可以将所有内容都提取到第二个 _,然后连接另一列:

select regexp_replace(a, '^([^_]+_[^_]+_).*', '') || b

如果你想修改列,逻辑在update:

update t
    set a = regexp_replace(a, '^([^_]+_[^_]+_).*', '') || b;

Here 是一个 db<>fiddle.

假设每个输入字符串至少有两个下划线,并且必须替换第二个下划线之后的所有内容,您可以比使用正则表达式更有效地执行此操作 - 请改用标准字符串函数。

select substr(columnA, 1, instr(columnA, '_', 1, 2)) || columnB
from   ...

(或在 update 中使用类似的方法)。 instrreturns第二个下划线在columnA中输入字符串的位置,然后substrreturns从第一个位置到并包括第二个下划线的子字符串。然后将 columnB 连接到该子字符串。代码在每个细节上都完全遵循逻辑。

如果输入的字符串有时可能少于两个下划线,您需要说明要求。上面的查询,仅在这些情况下,会将 columnA 中的 entire 字符串替换为 columnB 中的字符串——这可能不是预期的结果。在这些情况下可以修改查询,以实现所需的处理 - 同时仍然比正则表达式解决方案更有效。