Oracle数据库,高效率拆分逗号拼接字符串

列:id: 1 name: a,b,c,d

希望获得 :1:a,1:b,1:c,1:d

普遍案列:

select regexp_substr(q.nums, '[^,]+', 1, rownum,'i'), names
from (select '1,2,3' nums, '张三' names from dual) q
connect by rownum <= LENGTH(q.nums) - LENGTH(REGEXP_REPLACE(q.nums, ',', '')) + 1;

效率太差,表中数据一多,查询特别慢

高效率方案

SELECT
    id,
    substr(
        column_name,
        instr( column_name, ',', 1, levels.lvl ) + 1,
        instr( column_name, ',', 1, levels.lvl + 1 ) - ( instr( column_name, ',', 1, levels.lvl ) + 1 ) 
    ) AS column_name 
FROM
    (
    SELECT
        id,
        ',' || column_name || ',' AS column_name,
        length( column_name ) - nvl( length( REPLACE ( column_name, ',' ) ), 0 ) + 1 AS cnt 
    FROM
        table_name 
    ) a,
    (
    SELECT ROWNUM AS
        lvl 
    FROM
        (
        SELECT
            MAX( length( column_name || ',' ) - nvl( length( REPLACE ( column_name, ',' ) ), 0 ) ) max_len 
        FROM
            table_name 
        ) CONNECT BY LEVEL <= max_len 
    ) levels 
WHERE
    levels.lvl <= a.cnt 
ORDER BY
    id
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值