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

递归结果

排过序的结果

利用递归分割(Split)字符串的更多相关文章

  1. shell利用数组分割组合字符串

    #!/bin/bash #接收脚本参数如[sh a.txt .0_3_4_f_u_c_k_8080] a=$ #把参数分割成数组 arr=(${a//_/ }) #显示数组长度 #echo ${#ar ...

  2. Split字符串分割函数

    非常非常常用的一个函数Split字符串分割函数. Dim myTest myTest = "aaa/bbb/ccc/ddd/eee/fff/ggg" Dim arrTest arr ...

  3. Javascript:字符串分割split()妙用

    概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...

  4. freemarker中的split字符串分割

    freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  5. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  6. C语言实现split以某个字符分割一个字符串

    方式一: 使用strtok # include <string.h> # include <stdio.h> void split(char *src,const char * ...

  7. 字符串分割split()

    知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...

  8. split 将字符串分割成字符串数组

    list_name = list_name.split(","); split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separa ...

  9. java:字符串的split方法,使用多个分隔符,分割一个字符串

    java语言中,多个分隔符,分割一个字符串: String[] tmpAuthors=tempAuthorStr.split(";|,|:|,"); 可以在线测试:java代码 在 ...

随机推荐

  1. Linux Shell ssh登录脚本

    Linux 登陆服务器敲命令太多,某时候确实不便,所以就用shell写了一个  我的blog地址: http://www.cnblogs.com/caoguo 一.说明 支持秘密和密钥两种格式 用户名 ...

  2. CAD在网页中得到批注信息

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. Day 11 文件和异常

    文件和异常 在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中.说到“文件”这个词,可能需要先科普一下关于文件系统的知识,对于这个概念,维基百科 ...

  4. 18/10/19 周五欢乐赛题解(c++版)

    注意本题解并没有去追求最优解,只是用比较暴力的方法求解.D题听说要改说明不是位数30位,目前除了D题可能有问题之外其他代码已经全部正确. A.查找字串 用string BF(暴力求解即可) 代码 #i ...

  5. MongoDB - 认识MongoDB及数据类型

    目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...

  6. Bitvise ssh client+ chrome +SwitchyOmega *** (xjl456852原创)

    首先这个比ss还要简单,ss还需要在vps上搭建服务器.这个不需要. 但是无论是ss 还是 bitvise 都需要有一个自己的vps才行. 首先打开Bitvise ssh client程序:     ...

  7. jquery源码分析(七)——事件模块 event(二)

    上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...

  8. LINUX 查看硬件配置命令

      系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ...

  9. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  10. CTF密码学总结

    CTF中那些脑洞大开的编码和加密 摘自:https://www.cnblogs.com/mq0036/p/6544055.html 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到 ...