Mysql 日常案例Demo_02

描述

上面一篇博客说了如何把逗号拼接的字符串中的id逐个替换成对应的人名,现在新的需求是 将逗号拼接的字符串拆分程 逗号数量的数据行
比如 原始记录是

idexecutor
111,22,33,44

那么拆分后的效果是

idexecutor
111
122
133
144

实现方案

两种方式

  1. 递归cte表达式
  2. 和特定序列做笛卡尔积 ,从结果集里筛选
    第一种方案对逗号没有数量限制,
    第二种方案由于需要自定义序列,逗号的数量有限制
    下面给出具体实现

第一种

WITH RECURSIVE SplitExecutor AS (
    -- 基础部分:选择第一部分的值
    SELECT 
        id, 
        SUBSTRING_INDEX(executor, ',', 1) AS executor,
        SUBSTRING(executor, LENGTH(SUBSTRING_INDEX(executor, ',', 1)) + 2) AS remaining
    FROM (select 1 as id ,'1,2,3,4' as executor from dual )A
 
    
    UNION ALL
    
    -- 递归部分:继续拆分剩余的部分
    SELECT 
        id, 
        SUBSTRING_INDEX(remaining, ',', 1) AS executor,
        SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ',', 1)) + 2) AS remaining
    FROM SplitExecutor
    WHERE remaining != ''
)
SELECT id, executor,remaining
FROM SplitExecutor
ORDER BY id;

在这里插入图片描述
从第一行记录到最后ramaining条件不满足, 上面图片比较生动的解释了递归的执行过程,第一行是sql中 union all的上面的查询部分, 然后将该查询结果作为数据集 传递给下面的部分,直到下面的部分中的where条件不满足,亦或者 下面的查询部分查不出记录 为止。

第二种

with  task as (
  select '1,2,3,4' as title from dual
),
seq as (
select 1 as n 
union all 
select 2 
union all 
select 3 
union all 
select 4
)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.title,',',s.n),',',-1) AS substr 
FROM task t
cross join seq 	s 
WHERE  LENGTH(t.title)-LENGTH(REPLACE(t.title,',','')) >=s.n -1

在这里插入图片描述
这种就比较限制了,超过4个逗号的话 就会出问题了,所以具体需要哪种 自行斟酌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值