当前位置: 首页 > news >正文

oracle将表字段逗号分隔的值进行拆分,并替换值

需求背景:需要源数据变动,需要对历史表已存的字段值根据源数据进行更新。如果是单字段存值,直接根据映射表关联修改即可。但字段里面若存的值是以逗号分割,比如旧值:‘old1,old2,old3’,要根据映射关系调整为'new1,new2,new3'。

要求:出初始化更新脚本;

一、数据准备

我的历史表为 test_table, 需要对MUTI_VALUE字段进行数据更新

这是映射表 YINSE_TABLE,分别存着新值和旧值

结果为:(old22没有匹配)

二、SQL逻辑编写

第一步:拆分

先将test_table表进行拆分,以下是拆分Sql,将muti_value字段按逗号分隔全部查询出来,以SINGEELEMENT表示被拆分后的旧值。

SELECT t.RULE_ID ,t.RULE_NAME ,TRIM(REGEXP_SUBSTR(t.MUTI_VALUE , '[^,]+', 1, LEVEL)) AS singeElement,t.MUTI_VALUE  
FROM test_table t
CONNECT BY
LEVEL <= REGEXP_COUNT(t.MUTI_VALUE, '[^,]+')
AND PRIOR t.RULE_ID = t.RULE_ID 
AND PRIOR SYS_GUID() IS NOT NULL ;

第二步:映射

将以拆分的查询结果关联映射表;先将以上查询结果做成临时表,即使用with as创建临时表split_value,再将临时表跟映射表YINGSE_TABLE做关联,用singelement关联old_value,得到新值。然后得到rule_id 和 new_value的映射关系

SELECT DISTINCT t.RULE_ID ,t.NEW_VALUE FROM (
WITH split_value AS (
SELECT t.RULE_ID ,t.RULE_NAME ,TRIM(REGEXP_SUBSTR(t.MUTI_VALUE , '[^,]+', 1, LEVEL)) AS singeElement,t.MUTI_VALUE  
FROM test_table t
CONNECT BY
LEVEL <= REGEXP_COUNT(t.MUTI_VALUE, '[^,]+')
AND PRIOR t.RULE_ID = t.RULE_ID 
AND PRIOR SYS_GUID() IS NOT NULL
)
SELECT p.OLD_VALUE ,p.NEW_VALUE ,s.*  FROM split_value s
INNER JOIN YINSE_TALBE p ON s.singeElement = p.OLD_VALUE
) t WHERE t.NEW_VALUE IS NOT NULL ;

第三步:组装合并,更新

将rule_id跟new_value的值再次组装成以逗号分隔的数据,通过rule_id,一次行将历史表的值替换成新值;先组装数据:

SELECT t.RULE_ID , LISTAGG(t.new_value, ',') WITHIN GROUP (ORDER BY t.NEW_VALUE) AS newMutiValue FROM ( SELECT DISTINCT t.RULE_ID ,t.NEW_VALUE FROM (WITH split_value AS (SELECT t.RULE_ID ,t.RULE_NAME ,TRIM(REGEXP_SUBSTR(t.MUTI_VALUE , '[^,]+', 1, LEVEL)) AS singeElement,t.MUTI_VALUE  FROM test_table tCONNECT BYLEVEL <= REGEXP_COUNT(t.MUTI_VALUE, '[^,]+')AND PRIOR t.RULE_ID = t.RULE_ID AND PRIOR SYS_GUID() IS NOT NULL)SELECT p.OLD_VALUE ,p.NEW_VALUE ,s.*  FROM split_value sINNER JOIN YINSE_TALBE p ON s.singeElement = p.OLD_VALUE) t WHERE t.NEW_VALUE IS NOT NULL 
) t GROUP BY t.RULE_ID ;

然后根据这个结果更新到test_table表中,使用rule_id进行update;以下是更新语句:

MERGE INTO test_table t
USING (SELECT t.RULE_ID , LISTAGG(t.new_value, ',') WITHIN GROUP (ORDER BY t.NEW_VALUE) AS newMutiValue FROM ( SELECT DISTINCT t.RULE_ID ,t.NEW_VALUE FROM (WITH split_value AS (SELECT t.RULE_ID ,t.RULE_NAME ,TRIM(REGEXP_SUBSTR(t.MUTI_VALUE , '[^,]+', 1, LEVEL)) AS singeElement,t.MUTI_VALUE  FROM test_table tCONNECT BYLEVEL <= REGEXP_COUNT(t.MUTI_VALUE, '[^,]+')AND PRIOR t.RULE_ID = t.RULE_ID AND PRIOR SYS_GUID() IS NOT NULL)SELECT p.OLD_VALUE ,p.NEW_VALUE ,s.*  FROM split_value sINNER JOIN YINSE_TALBE p ON s.singeElement = p.OLD_VALUE) t WHERE t.NEW_VALUE IS NOT NULL ) t GROUP BY t.RULE_ID 
) s ON (t.RULE_ID = s.RULE_ID)
WHEN MATCHED THEN UPDATE SET t.MUTI_VALUE = s.newMutiValue;

最后查询test_table表

相关文章:

  • ​CTGCache ​CTG-Cache TeleDB
  • 【MySQL数据库】表的约束
  • 工程投标k值分析系统(需求和功能说明)
  • 使用Multipart Form-Data一次请求获取多张图片
  • 真我推出首款 AI 翻译耳机,支持 32 种语言翻译
  • 2.5 函数的拓展
  • LangGraph(二)——QuickStart样例中的第二步
  • C++ std::forward 详解
  • 【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
  • 在 40 亿整数中捕获“恰好出现两次”的数字
  • 动态提示词(小模型)、RAG和提示词系统
  • 【CPP】固定大小内存池
  • 蓝牙 6.0 发布,解锁无线科技新可能
  • 【TeamFlow】4.3.2 细化时间单位
  • ISO15189认证有什么要求?ISO15189认证流程
  • 15.三数之和(LeetCode)java
  • 数据集 | 柑橘果目标检测数据集
  • 云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)
  • Oracle--SQL事务操作与管理流程
  • Vue2-样式相关
  • 陈曦任中华人民共和国二级大法官
  • 全国人大常委会调研组在宁波调研,张庆伟带队钟山易炼红参加
  • 王毅同英国外交大臣拉米通电话
  • 上海34年“老外贸”张斌:穿越风暴,必须靠过硬的核心竞争力
  • 李家超率团访问浙江
  • 民政部:从未设立或批准设立“一脉养老”“惠民工程”项目,有关App涉嫌诈骗