zoukankan      html  css  js  c++  java
  • 展开中断或忽略的序号

    网上有人问:

    declare @WH varchar(MAX)
    set @WH='C1,C2,C3-C9,C20,C22,C30-C35'

    想要循环截取出含有-的字符串 C3-C9,C30-C35,展开C3-C9,C30-C35,
    将@WH替换为 'C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35'

    Insus.NET也想练习一下。

    写一个自定义函数来处理需要展开的字符串:

     

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:      Insus.NET
    -- Create date: 2019-05-27
    -- Update date: 2019-05-27
    -- Description: 填充中断的字符串
    -- =============================================
    CREATE FUNCTION [dbo].[svf_FillConnectionString]
    (
        @string NVARCHAR(MAX)
    )
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN  
        DECLARE @rtv  NVARCHAR(MAX) = N''
    
        DECLARE @hyphen VARCHAR(1) = N'-'
        IF @string LIKE '%'+ @hyphen +'%'
        BEGIN
            DECLARE @hyphen_position INT = CHARINDEX(@hyphen, @string)
           
            DECLARE @Front NVARCHAR(40) = SUBSTRING(@string, 1, @hyphen_position - 1)
            DECLARE @Back NVARCHAR(40) = SUBSTRING(@string, @hyphen_position + 1, LEN(@string)- @hyphen_position)
    
            DECLARE @f INT = CAST(SUBSTRING(@Front, 2, LEN(@Front) - 1) AS INT)
            DECLARE @b INT = CAST(SUBSTRING(@Back, 2, LEN(@Back) - 1) AS INT)
    
            WHILE @f <= @b
            BEGIN
                SET @rtv = @rtv + N',' + N'C' + CAST(@f AS NVARCHAR(MAX))
                SET @f = @f + 1
            END
        END
        
        RETURN CASE WHEN LEN(ISNULL(@rtv,N'')) = 0 THEN @string ELSE STUFF(@rtv,1,1,N'') END
    END
    Source Code

    另一个自定义函数:

    把字符串转换为表:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:      Insus.NET
    -- Create date: 2019-05-27
    -- Update date: 2019-05-27
    -- Description: 拆分字符串转为表
    -- =============================================
    CREATE FUNCTION [dbo].[tvf_ConvertStringToTable]
    (
        @OriginalString NVARCHAR(MAX),
        @Delimiter CHAR(1)
    ) 
    RETURNS @Result TABLE ([value] NVARCHAR(MAX))
    AS
    BEGIN
        DECLARE @xml XML = CAST('<insus>' + REPLACE(@OriginalString,@Delimiter,'</insus><insus>') + '</insus>' AS XML)
        INSERT INTO @Result([value]) SELECT n.value('.','NVARCHAR(MAX)') AS w
        FROM @xml.nodes('/insus') AS E(n)
      RETURN
    END
    GO
    Source Code

    现在试使用上面2个函数,看看结果如何?

    DECLARE @WH VARCHAR(MAX)
    SET @WH='C1,C2,C3-C9,C20,C22,C30-C35'
    
    ;WITH HW AS
    (
        SELECT [value] FROM [dbo].[tvf_ConvertStringToTable](@WH,',')
    )
    SELECT [value],[dbo].[svf_FillConnectionString]([value]) as [str] FROM HW
    Source Code


    差不多接近要求了,现在只要把[str]这列的数据连接起来就OK了。

    如何连接,参考这篇《列值转换为逗号分隔字符串https://www.cnblogs.com/insus/p/10852906.html

    DECLARE @ok_string NVARCHAR(MAX)
    
    DECLARE @WH VARCHAR(MAX)
    SET @WH='C1,C2,C3-C9,C20,C22,C30-C35'
    
    ;WITH HW AS
    (
        SELECT [value] FROM [dbo].[tvf_ConvertStringToTable](@WH,',')
    )
    --SELECT [value],[dbo].[svf_FillConnectionString]([value]) as [str] FROM HW
    
    SELECT @ok_string = ISNULL(@ok_string + ',', '') + [dbo].[svf_FillConnectionString]([value]) FROM HW
    SELECT @ok_string
    Source Code

    大功告成!

  • 相关阅读:
    centos ppp拨号
    Xen、KVM和VirtualBox比拼
    static用法一
    linux浏览器,邮件客户端,输入法,双屏设置,应用软件,gnome-screenshot/scrot -s截图,office
    OpenGl学习总结
    DICOM医学图像处理:DCMTK在VS2012中的配置
    linux下用mail发送邮件
    (HLS播放器之中的一个)HLS协议之M3U8解析
    tcpdump抓包分析具体解释
    对账简单说
  • 原文地址:https://www.cnblogs.com/insus/p/10929956.html
Copyright © 2011-2022 走看看