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
中使用类似的方法)。 instr
returns第二个下划线在columnA
中输入字符串的位置,然后substr
returns从第一个位置到并包括第二个下划线的子字符串。然后将 columnB
连接到该子字符串。代码在每个细节上都完全遵循逻辑。
如果输入的字符串有时可能少于两个下划线,您需要说明要求。上面的查询,仅在这些情况下,会将 columnA
中的 entire 字符串替换为 columnB
中的字符串——这可能不是预期的结果。在这些情况下可以修改查询,以实现所需的处理 - 同时仍然比正则表达式解决方案更有效。
我在 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
中使用类似的方法)。 instr
returns第二个下划线在columnA
中输入字符串的位置,然后substr
returns从第一个位置到并包括第二个下划线的子字符串。然后将 columnB
连接到该子字符串。代码在每个细节上都完全遵循逻辑。
如果输入的字符串有时可能少于两个下划线,您需要说明要求。上面的查询,仅在这些情况下,会将 columnA
中的 entire 字符串替换为 columnB
中的字符串——这可能不是预期的结果。在这些情况下可以修改查询,以实现所需的处理 - 同时仍然比正则表达式解决方案更有效。