利用递归分割(Split)字符串

利用递归分割(Split)字符串

工作需要将表里的某个字段分割之后再插入到另一个表中,其实数据量不大,直接用游标一行一行的取,再利用循环来分割之后再实现数据的插入应该可以直接满足需求。但是,想到递归应该也可以实现需求,而且递归也不太熟,所以就以试试的心态来做一下,想不到既然实现了需要的效果。
初始化:

--需要分割的结果集
SELECT
* 
INTO #tmp_t1
FROM (VALUES('Morning,Midday,Evening,',1),('Breakfast,Midday,Evening,',2)) AS x(dayPart,types); --需要split的字符串手动添加了个逗号,

SELECT * FROM #tmp_t1

需要分割的字段
enter description here

下面使用公用表达式来实现递归:

;WITH CTE_recursive AS(
    --定位点成员
    SELECT 
        CHARINDEX(',',dayPart) AS idx, --得到第一个逗号的下标
        REPLACE(SUBSTRING(daypart,1,CHARINDEX(',',dayPart)),',','') AS dp, --得到第一个逗号前的字符
        SUBSTRING(dayPart,len(REPLACE(SUBSTRING(dayPart,1,CHARINDEX(',',dayPart)),',',''))+2,len(dayPart)) AS dayPart, --截取第一个逗号后面的字符串
        types 
    FROM #tmp_t1
    UNION ALL
    --递归成员
    SELECT 
        CHARINDEX(',',cte.dayPart) AS idx, 
        REPLACE(SUBSTRING(cte.daypart,1,CHARINDEX(',',cte.dayPart)),',','') AS dp, 
        SUBSTRING(cte.daypart,len(REPLACE(SUBSTRING(cte.dayPart,1,CHARINDEX(',',cte.dayPart)),',',''))+2,len(cte.dayPart)) AS dayPart, 
        cte.types
    FROM CTE_recursive cte
        INNER JOIN #tmp_t1 t1 ON cte.types = t1.types
    WHERE CHARINDEX(',',cte.dayPart) > 0 --中止递归的条件
)
SELECT * FROM CTE_recursive --ORDER BY types;

递归结果
enter description here

排过序的结果
enter description here

转载于:https://www.cnblogs.com/leongfeng/p/5361244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值