利用递归分割(Split)字符串
2016-04-06 21:34
387 查看
利用递归分割(Split)字符串
SqlServer递归
工作需要将表里的某个字段分割之后再插入到另一个表中,其实数据量不大,直接用游标一行一行的取,再利用循环来分割之后再实现数据的插入应该可以直接满足需求。但是,想到递归应该也可以实现需求,而且递归也不太熟,所以就以试试的心态来做一下,想不到既然实现了需要的效果。
初始化:
--需要分割的结果集 SELECT * INTO #tmp_t1 FROM (VALUES('Morning,Midday,Evening,',1),('Breakfast,Midday,Evening,',2)) AS x(dayPart,types); --需要split的字符串手动添加了个逗号, SELECT * FROM #tmp_t1
需要分割的字段
下面使用公用表达式来实现递归:
;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;
递归结果
排过序的结果
相关文章推荐
- WIN32汇编定时器的使用
- A2
- Apache Kylin在百度地图的实践
- NEU 1007 (字典树 DP)
- 开源思想
- 第六周周记
- 杭电2131
- Xen-Server 6.5 从虚拟机快照中创建虚拟机模板
- Golang输出颜色
- 7、Mysql的log-bin日志
- 终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)
- c++ lesson 一(命名空间输入输出)
- 转载:分布式Session共享:tomcat+memcached实现session共享
- HttpClient学习
- [置顶] JavaSE学习笔记_14:Java-Runtime类
- oracel 备份恢复之 recover database的四条语句的区别
- C++顺序性容器、关联性容器与容器适配器
- 小白在ubuntu14.04上利用putty访问服务器
- Android 引导使用说明、标签功能的封装库
- Xen-Server 6.5 VM模板中创建虚拟机