利用递归分割(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
需要分割的字段
下面使用公用表达式来实现递归:
;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)字符串的更多相关文章
- shell利用数组分割组合字符串
#!/bin/bash #接收脚本参数如[sh a.txt .0_3_4_f_u_c_k_8080] a=$ #把参数分割成数组 arr=(${a//_/ }) #显示数组长度 #echo ${#ar ...
- Split字符串分割函数
非常非常常用的一个函数Split字符串分割函数. Dim myTest myTest = "aaa/bbb/ccc/ddd/eee/fff/ggg" Dim arrTest arr ...
- Javascript:字符串分割split()妙用
概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...
- freemarker中的split字符串分割
freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...
- freemarker中的split字符串分割(十六)
1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...
- C语言实现split以某个字符分割一个字符串
方式一: 使用strtok # include <string.h> # include <stdio.h> void split(char *src,const char * ...
- 字符串分割split()
知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...
- split 将字符串分割成字符串数组
list_name = list_name.split(","); split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separa ...
- java:字符串的split方法,使用多个分隔符,分割一个字符串
java语言中,多个分隔符,分割一个字符串: String[] tmpAuthors=tempAuthorStr.split(";|,|:|,"); 可以在线测试:java代码 在 ...
随机推荐
- [Windows Server 2003] 服务器安全加固
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:服务器安全加固 ...
- python编辑csv
import csv import time def timestamp_to_timestr(timeStamp): timeArray = time.localtime(int(timeStamp ...
- c#中动态创建textbox并且从数据库中获取表中数据添加到textbox中
private void FormLugOther_Load(object sender, EventArgs e) { foreach (string str in FormLug.FieldLis ...
- Java中“==”、“compareTo()”和“equals()”的区别
在比较两个对象或者数据大小的时候,经常会用到==.compareTo()和equals(),尤其是在接入了Comparable接口后重写compareTo方法等场景,所以我们来理一下这三个的区别. 1 ...
- C# 后台POST提交方式
1.第一种方式:用最新框架,但是针对IIS服务器的操作系统有关系,非R2的收不到数据: using (var reqConts = new MultipartFormDataContent()) { ...
- 【剑指Offer】66、机器人的运动范围
题目描述: 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时 ...
- sysbench_fileio.sh
当我--file-total-size=30G 并且指定3个文件的时候,结果是产生3个10G的文件,然而--max-time=20被忽视了,虽然指定了20s的限制,实际上是在prepare阶段,--m ...
- JS对象中,在原型链上找到属性后 最终将值拷贝给原对象 而不是引用
遇到一个面试题 要求写一个函数A,每次进行new操作时候能输出2,3,4,5... new A() // 输出2 new A() // 输出3 new A() // 输出4 function A() ...
- 图的连通性问题之连通和最小环——Floyd算法
Floyd 判断连通性 d[i][j]仅表示i,j之间是否联通 ;k<=n;k++) ;i<=n;i++) ;j<=n;j++) dis[i][j]=dis[i][j]||(dis[ ...
- ORM 事务
orm 事务: import datetime from appxx import models try: from django.db import transaction with transac ...