oracle值sql记录

前言
由于本人sql比较薄弱 将一些常用又使用的sql语句记录与大家分享
一:替换特殊字符分割的字符串
需求如下:
有张原始表tschedule 和新表bjcodechange ,需要将原始表的compeny_code字段和bjcodechange 的oldwindcode 进行关联替换成bjcodechange表的newwindcode字段
无特殊字符的查询很简单 如下


UPDATE tschedule  ts
   SET ts.security_code =
       (SELECT bj.newwindcode
          FROM BJcodechange bj
         WHERE ts.security_code = bj.oldwindcode
           )
 WHERE EXISTS (SELECT 1
          FROM BJcodechange bj
         WHERE ts.security_code = bj.oldwindcode);

但是有特殊字符的数据如下 注意测试原始表的compeny_code字段的内容许如下所示
tschedule:

namecompeny_code
张三000001
李四800981,000001,000002

bjcodechange:

oldwindcodenewwindcode
800981888888

最终的效果如下

namecompeny_code
张三000001
李四888888 ,000001,000002

完整步骤
步骤1:拆分后的中间数据 (split_data)

ridelemord
OKABKyAAA2AAAAiTAAD0000011
OKABKyAAA2AAAAiTAAD8009812
OKABKyAAA2AAAAiTAAD0000013
AABKyAAA2AAAAiTAAD0000021
步骤2:关联后的中间数据
ridelemnewwindcode
-------------------------------------------
OKABKyAAA2AAAAiTAAD430017920017
OKABKyAAA2AAAAiTAAD000001(null)
OKABKyAAA2AAAAiTAAD430017920017
AABKyAAA2AAAAiTAAD000001(null)
步骤3:聚合后的结果 (merged)
ridnew_code
-------------------------------------------
OKABKyAAA2AAAAiTAAD920017,000001,920017
AABKyAAA2AAAAiTAAD000001
MERGE INTO tschedule a
USING (
  WITH split_data AS (
    SELECT 
      a.rowid AS rid, 
      regexp_substr(a.compeny_code, '[^,]+', 1, LEVEL) AS elem,
      LEVEL AS ord
    FROM tschedule a
    CONNECT BY 
      LEVEL <= regexp_count(a.compeny_code, ',') + 1
      AND PRIOR a.rowid = a.rowid
      AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
  )
  SELECT 
    rid,
    LISTAGG(NVL(b.newwindcode, elem), ',') WITHIN GROUP (ORDER BY ord) AS new_code 
  FROM split_data sd
  LEFT JOIN bjcodechange b ON sd.elem = b.oldwindcode  
  GROUP BY rid
) merged
ON (a.rowid = merged.rid)
WHEN MATCHED THEN
  UPDATE SET a.compeny_code = merged.new_code
WHERE a.compeny_code != merged.new_code;

好了 至此 oracle值sql记录 点点关注不迷路 老铁们!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值