zoukankan      html  css  js  c++  java
  • 利用递归分割(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

  • 相关阅读:
    C#ModBus Tcp 报文解析
    C#ModBus Tcp的学习及Master的实现
    C#原生Socket服务器与客户端的实现
    转载:C# 创建、部署和调用WebService的简单示例
    记kepServer读写西门子PLC
    C#实现某一属性值变化时触发事件
    C#倒计时关闭提示框
    C#SuperSocket的搭建--通过配置启动
    C#串口扫描枪的简单实现
    C#SuperSocket服务器的简易实现
  • 原文地址:https://www.cnblogs.com/leongfeng/p/5361244.html
Copyright © 2011-2022 走看看