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 用不同的列值替换特定字符串的主要内容,如果未能解决你的问题,请参考以下文章
SQL求助,我要想在一张表新增多行,只有第一列值不同,后面的列值相同,该怎么插入?