Oracle按条件拆分e_owner字段插入new_target表及报错解决
完整解决方案
核心修改点
- 新增括号判断逻辑:使用
REGEXP_LIKE(e_owner, '\(.*\)')匹配包含括号的内容,匹配成功则只生成1条数据,直接取完整e_owner作为字段值 - 修正插入语句语法:
t_id字段已配置默认值new_target_sq.NEXTVAL,无需显式传值,删除原语句中错误的t_id.nextval写法,直接搭配SELECT结果集插入即可
可直接运行的插入语句
INSERT INTO new_target(e_id, t_owner, sort_order) SELECT e_id, CASE WHEN REGEXP_LIKE(e_owner, '\(.*\)') THEN e_owner ELSE TRIM(REGEXP_SUBSTR(e_owner, '[^,]+', 1, LEVEL)) END AS t_owner, LEVEL AS sort_order FROM new_staging CONNECT BY e_id = PRIOR e_id AND LEVEL <= CASE WHEN REGEXP_LIKE(e_owner, '\(.*\)') THEN 1 ELSE REGEXP_COUNT(e_owner, ',') + 1 END AND PRIOR SYS_GUID() IS NOT NULL;
执行效果验证
插入后new_target表共生成8条数据,完全符合需求:
- e_id=1:生成2条数据,sort_order分别为1、2,对应拆分后的AUZA、PAUL OSA
- e_id=2:生成2条数据,sort_order分别为1、2,对应拆分后的PAUL、REXX OSA
- e_id=3:生成1条数据,sort_order为1,保留完整原始e_owner值
- e_id=4:生成3条数据,sort_order分别为1、2、3,对应拆分后的PAUL、REXX、OSA
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

