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

  • 相关阅读:
    自考新教材--p78
    自考新教材--p76_2
    自考新教材--p76_1
    自考新教材--p75
    自考新教材--p70
    自考新教材--p69
    以HTML5及其衍生技术为基础的B/S架构实时视频监控解决方案
    智能化安防视频监控行业发展是如何转变的?
    摄像头视频监控是如何与流媒体服务器云平台连接的?
    如何实现摄像头监控数据实时存储及传输?
  • 原文地址:https://www.cnblogs.com/leongfeng/p/5361244.html
Copyright © 2011-2022 走看看