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

Posted

技术标签:

【中文标题】Oracle SQL REGEXP 用不同的列值替换特定字符串【英文标题】:Oracle SQL REGEXP to replace a particular string with different column value 【发布时间】: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 列中的字符串总是有两个下划线 【参考方案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 中的字符串——可能不是预期的结果。在这些情况下可以修改查询,以实现所需的处理 - 同时仍然比正则表达式解决方案更有效。

【讨论】:

以上是关于Oracle SQL REGEXP 用不同的列值替换特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql查询以获取没有空格的列值

用于连接 Oracle 中多行的列值的 SQL 查询

如何在 Oracle 数据库中获取更多列值以及不同的列?

SQL求助,我要想在一张表新增多行,只有第一列值不同,后面的列值相同,该怎么插入?

更新之前的Oracle SQL触发器,用于设置来自其他实体的列值

使用 SQL 数据库查询以不同的时间间隔减去相同的列值