利用递归分割(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

posted @ 2016-04-06 21:34  无名的风吹草地  阅读(630)  评论(0编辑  收藏  举报