Oracle SQL -更新第一个子字符串

ykejflvf  于 2023-03-01  发布在  Oracle
关注(0)|答案(2)|浏览(115)

我有列VPN中的数据,如:
| 项目|虚拟专用网|
| - ------|- ------|
| 小行星A124343|007 - 46 - 307-红色中号|
| 小行星A154363|008 - 25 - 203-黄色介质|
我有另一个表UPDATED_VPN作为
| 项目|虚拟专用网|
| - ------|- ------|
| 小行星A124343|小零二四|
| 小行星A154363|小零四一|
我想用新VPN更新VPN的第一个字符串,匹配So项
A124343 007 - 46 - 307-红色培养基
将成为
A124343024-46 -307-红色培养基
怎么做呢?

vh0rcniy

vh0rcniy1#

可以在WHERE条件中将UPDATE语句与EXISTS沿着使用,例如

UPDATE vpn v
   SET vpn = ( SELECT u.vpn||SUBSTR(v.vpn,INSTR(v.vpn,'-')) 
                 FROM updated_vpn u 
                WHERE u.item = v.item  )
 WHERE EXISTS ( SELECT 0 FROM updated_vpn u WHERE u.item = v.item  )

Demo
或者,也可以使用带有MATCHED选项的MERGE语句,例如

MERGE INTO vpn v 
     USING updated_vpn u
        ON ( v.item = u.item )
      WHEN MATCHED THEN UPDATE SET v.vpn = u.vpn||SUBSTR(v.vpn,INSTR(v.vpn,'-'))

Demo

nle07wnf

nle07wnf2#

样本数据:

create table vpns (item varchar2(10), vpn varchar2(30));
create table updated_vpns (item varchar2(10), vpn varchar2(30));

insert all
    into vpns values ('A124343', '007-46-307-RED MEDIUM')
    into vpns values ('A154363', '008-25-203-YELLOW MEDIUM')
    into updated_vpns values ('A124343', '024')
    into updated_vpns values ('A154363', '041')
select * from dual;

更新语句(也可以使用merge):

update vpns v
set    v.vpn =
       ( select regexp_replace(v.vpn, '([^-]+)', u.vpn, 1, 2)
         from   updated_vpns u
         where  u.item = v.item );

结果:

ITEM       VPN
---------- ------------------------------
A124343    007-024-307-RED MEDIUM
A154363    008-041-203-YELLOW MEDIUM

相关问题