【问题标题】:Oracle SQL REGEXP to replace a particular string with different column valueOracle SQL REGEXP 用不同的列值替换特定字符串
【发布时间】:2021-07-09 00:45:43
【问题描述】:

我在 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)。但它没有按预期工作。有人可以分享他们的意见吗?

【问题讨论】:

  • A 列中的字符串是否总是正好有两个下划线?有时可以有更多吗?更重要的是,可以有少于两个吗?在这些情况下,需求有何变化?
  • A 列中的字符串总是有两个下划线

标签: sql oracle regexp-replace


【解决方案1】:

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

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

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

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

Here 是一个 dbfiddle。

【讨论】:

  • @mathguy 。 . .谢谢你。我解决了这个问题。具有讽刺意味的是,当我测试答案时,我很可能会犯错误。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2020-10-03
    • 2023-03-27
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多