当前位置: 首页 > 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表

http://www.xdnf.cn/news/91639.html

相关文章:

  • Spark–steaming
  • 【LLM+Code】Claude Code Agent 0.2.9 版本最细致解读
  • Cursor Free VIP 重置进程错误,轻松恢复使用!
  • Element Plus消息通知体系深度解析:从基础到企业级实践
  • SwiftInfer —— 大模型无限流式输入推理打破多轮对话长度限制
  • 序列决策问题(Sequential Decision-Making Problem)
  • 测试开发 - Java 自动化测试核心函数详解
  • 【云馨AI-大模型】Dify 1.2.0:极速集成 SearXNG,畅享智能联网搜索新境界,一键脚本轻松部署SearXNG
  • LeetCode算法题(Go语言实现)_55
  • 麒麟系统使用-系统设置
  • 详解BUG(又名:BUG的生命周期)
  • 从0到1构建企业级消息系统服务体系(终):当消息系统学会「读心术」揭秘情感计算如何让触达转化率飙升 200%
  • Unity 导出Excel表格
  • 可变参数模板 和 折叠表达式 (C++)
  • 人工智能-模型评价与优化(过拟合与欠拟合,数据分离与混淆矩阵,模型优化,实战)
  • 《AI大模型应知应会100篇》第32篇:大模型与医疗健康:辅助诊断的可能性与风险
  • RAG进阶:Embedding Models嵌入式模型原理和选择
  • 【网络应用程序设计】实验一:本地机上的聊天室
  • 1.HTTP协议与RESTful设计
  • char32_t、char16_t、wchar_t 用于 c++ 语言里存储 unicode 编码的字符,给出它们的具体定义
  • 【武汉理工大学第四届ACM校赛】copy
  • 凡清亮相第十五届北京国际电影节电影嘉年华,用音乐致敬青春与梦想
  • 调和平均数通俗易懂的解释以及为什么这样定义,有什么用
  • 《 C++ 点滴漫谈: 三十四 》从重复到泛型,C++ 函数模板的诞生之路
  • 客户对质量不满意,如何快速响应?
  • ycsb性能测试的优缺点
  • GRS认证有什么要求?GRS认证要审核多久,GRS认证流程
  • 旅游行业路线预定定制旅游小程序开发
  • vivado XMP使用
  • 2023蓝帽杯初赛内存取证-1