You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle如何拆分多分隔符列并提取拼接后更新同行列?

Oracle拆分字段并拼接更新的解决方案

需求说明

需要处理suppliers_tbl表的Supplier_ID_NAME列:

  • 按逗号拆分每个记录的内容
  • 对每个拆分出的子项,按-分隔后提取第一部分(供应商ID)
  • 将所有提取的ID用逗号拼接,更新到同表的Supplier_id列

输入示例:

ID Supplier_ID_NAME 
1  1234 - Supplier 1,2145 - Supplier 3
2  1235 - Supplier 2
3  1246 - Supplier 4,1234 - Supplier 1, 1478 - Supplier 5

期望输出:

ID Supplier_id
1  1234,2145
2  1235
3  1246,1234,1478

正确实现方式

1. 查询验证结果

先通过查询确认提取拼接后的ID是否正确:

SELECT 
    id,
    LISTAGG(TRIM(REGEXP_SUBSTR(split_item, '^[^-]+')), ',') WITHIN GROUP (ORDER BY rownum) AS Supplier_id
FROM (
    SELECT 
        id,
        TRIM(REGEXP_SUBSTR(Supplier_ID_NAME, '[^,]+', 1, LEVEL)) AS split_item
    FROM suppliers_tbl
    CONNECT BY 
        LEVEL <= REGEXP_COUNT(Supplier_ID_NAME, ',') + 1
        AND PRIOR id = id
        AND PRIOR SYS_GUID() IS NOT NULL -- 防止生成重复行
)
GROUP BY id;

2. 执行更新操作

验证无误后,用MERGE语句更新表:

MERGE INTO suppliers_tbl t
USING (
    SELECT 
        id,
        LISTAGG(TRIM(REGEXP_SUBSTR(split_item, '^[^-]+')), ',') WITHIN GROUP (ORDER BY rownum) AS new_supplier_id
    FROM (
        SELECT 
            id,
            TRIM(REGEXP_SUBSTR(Supplier_ID_NAME, '[^,]+', 1, LEVEL)) AS split_item
        FROM suppliers_tbl
        CONNECT BY 
            LEVEL <= REGEXP_COUNT(Supplier_ID_NAME, ',') + 1
            AND PRIOR id = id
            AND PRIOR SYS_GUID() IS NOT NULL
    )
    GROUP BY id
) s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.Supplier_id = s.new_supplier_id;

原查询问题原因

你之前的查询仅指定了REGEXP_SUBSTR的最后一个匹配位置,只能获取最后一个逗号分隔的子项,无法遍历所有子项完成ID提取和拼接。

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:15