【问题标题】:Splitting a dynamic string拆分动态字符串
【发布时间】:2014-09-21 08:23:38
【问题描述】:

我需要帮助解析动态字符串(见下文)。此字符串可以更改为只有一组值到两个、三个(如下面的)。

原始字符串:

valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE&valueA=valueB=valueC=valueD==valueE

最终结果:VelueB, ValueB, ValueB

我已经能够使用STUFFCHARINDEX 函数提取valueA(见下文),但我很难获得valueB。我也尝试过使用 split 函数在 ssrs 中执行此操作,但无济于事。

STUFF(( SELECT  ',' + ' ' + SUBSTRING(param, 1,
                                              CHARINDEX('=', param) - 1)
                FROM    dbo.Fn_mvparam(column_a, '&') AS fm
              FOR
                XML PATH('')
              ), 1, 1, ' ')

【问题讨论】:

  • Tsql split string 的可能重复项
  • 我查看了这些,据我了解,这些值是静态的。我的字符串可以改变,所以它并不能真正解决我的问题。我将标题更改为更具体。谢谢!
  • 在你的例子中,为什么输出只有ValueB?
  • 我需要的输出不是我得到的。谢谢!
  • 我明白,但为什么呢?逻辑是什么?

标签: sql-server tsql reporting-services split charindex


【解决方案1】:

应该这样做:

REPLACE(@Param, "=", ", ")

【讨论】:

    【解决方案2】:

    这应该可以为您解决问题。希望对你有用

    CREATE FUNCTION uft_DoubleSplitter 
    (   
        -- Add the parameters for the function here
        @String VARCHAR(4000), 
        @Splitter1 CHAR,
        @Splitter2 CHAR
    )
    RETURNS @Result TABLE (Id INT,MId INT,SValue VARCHAR(4000))
    AS
    BEGIN
    DECLARE @FResult TABLE(Id INT IDENTITY(1, 1),
                       SValue VARCHAR(4000))
    DECLARE @SResult TABLE(Id INT IDENTITY(1, 1),
                       MId INT,
                       SValue VARCHAR(4000))
    SET @String = @String+@Splitter1
    
    WHILE CHARINDEX(@Splitter1, @String) > 0
        BEGIN
           DECLARE @WorkingString VARCHAR(4000) = NULL
    
           SET @WorkingString = SUBSTRING(@String, 1, CHARINDEX(@Splitter1, @String) - 1)
           --Print @workingString
    
           INSERT INTO @FResult
           SELECT CASE
                WHEN @WorkingString = '' THEN NULL
                ELSE @WorkingString
                END
    
           SET @String = SUBSTRING(@String, LEN(@WorkingString) + 2, LEN(@String))
    
        END
    IF ISNULL(@Splitter2, '') != ''
        BEGIN
           DECLARE @OStartLoop INT
           DECLARE @OEndLoop INT
    
           SELECT @OStartLoop = MIN(Id),
                @OEndLoop = MAX(Id)
           FROM @FResult
    
           WHILE @OStartLoop <= @OEndLoop
              BEGIN
                 DECLARE @iString VARCHAR(4000)
                 DECLARE @iMId INT
    
                 SELECT @iString = SValue+@Splitter2,
                       @iMId = Id
                 FROM @FResult
                 WHERE Id = @OStartLoop
    
                 WHILE CHARINDEX(@Splitter2, @iString) > 0
                    BEGIN
                        DECLARE @iWorkingString VARCHAR(4000) = NULL
    
                        SET @IWorkingString = SUBSTRING(@iString, 1, CHARINDEX(@Splitter2, @iString) - 1)
    
                        INSERT INTO @SResult
                        SELECT @iMId,
                             CASE
                             WHEN @iWorkingString = '' THEN NULL
                             ELSE @iWorkingString
                             END
    
                        SET @iString = SUBSTRING(@iString, LEN(@iWorkingString) + 2, LEN(@iString))
    
                    END
    
                 SET @OStartLoop = @OStartLoop + 1
              END
           INSERT INTO @Result
           SELECT MId AS PrimarySplitID,
                ROW_NUMBER() OVER (PARTITION BY MId ORDER BY Mid, Id) AS SecondarySplitID ,
                SValue
           FROM @SResult
        END
    ELSE
        BEGIN
           INSERT INTO @Result
           SELECT Id AS PrimarySplitID,
                NULL AS SecondarySplitID,
                SValue
           FROM @FResult
        END
    RETURN
    

    用法:

    --FirstSplit
    SELECT * FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===','&',NULL)
    
    --Second Split
    SELECT * FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===','&','=')
    

    情景答案:

    SELECT fn.SValue
    FROM uft_DoubleSplitter('ValueA=ValueB=ValueC=ValueD==ValueE&ValueA=ValueB=ValueC===ValueE&ValueA=ValueB==ValueD===', '&', '=')AS fn
    WHERE fn.mid = 2
    

    【讨论】:

    • 删除了之前的评论,因为我能够将它合并到我的脚本中。我现在遇到的最后一个问题是我将这些额外的字符添加到我需要删除的结果集中 SCRIPT: STUFF(( SELECT svalue FROM dbo.F_DoubleSplitter(column_a, '&', '=') AS fm WHERE fm.mid=2 FOR XML PATH('') ), 1, 1, ' ') 结果集:'svalue>1225'
    • 请执行此操作 STUFF(( SELECT ','+svalue FROM dbo.F_DoubleSplitter(column_a, '&', '=') AS fm WHERE fm.mid=2 FOR XML PATH('') ), 1, 1, '')
    • 很高兴它对您有所帮助。快乐编码
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多