Replace values in a CSV string

后端 未结 4 1157
忘了有多久
忘了有多久 2021-01-25 08:22

I have a list of products in comma separated fashion and since the item list was replaced with new product items, I am trying to modify this CSV list with new product item list.

4条回答
  •  温柔的废话
    2021-01-25 09:16

    Adam Machanic's blog contains this posting of a T-SQL only UDF which can accept T-SQL's wildcards for use in replacement.

    http://dataeducation.com/splitting-a-string-of-unlimited-length/

    For my own use, I adjusted the varchar sizes to max. Also note that this UDF performs rather slowly, but if you cannot use the CLR, it may be an option. The minor changes I made to the author's code may limit use of this to SQL Server 2008r2 and later.

    CREATE FUNCTION dbo.PatternReplace
    (
       @InputString VARCHAR(max),
       @Pattern VARCHAR(max),
       @ReplaceText VARCHAR(max)
    )
    RETURNS VARCHAR(max)
    AS
    BEGIN
       DECLARE @Result VARCHAR(max) = ''
       -- First character in a match
       DECLARE @First INT
       -- Next character to start search on
       DECLARE @Next INT = 1
       -- Length of the total string -- 0 if @InputString is NULL
       DECLARE @Len INT = COALESCE(LEN(@InputString), 0)
       -- End of a pattern
       DECLARE @EndPattern INT
    
       WHILE (@Next <= @Len) 
       BEGIN
          SET @First = PATINDEX('%' + @Pattern + '%', SUBSTRING(@InputString, @Next, @Len))
          IF COALESCE(@First, 0) = 0 --no match - return
          BEGIN
             SET @Result = @Result + 
                CASE --return NULL, just like REPLACE, if inputs are NULL
                   WHEN  @InputString IS NULL
                         OR @Pattern IS NULL
                         OR @ReplaceText IS NULL THEN NULL
                   ELSE SUBSTRING(@InputString, @Next, @Len)
                END
             BREAK
          END
          ELSE
          BEGIN
             -- Concatenate characters before the match to the result
             SET @Result = @Result + SUBSTRING(@InputString, @Next, @First - 1)
             SET @Next = @Next + @First - 1
    
             SET @EndPattern = 1
             -- Find start of end pattern range
             WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) = 0
                SET @EndPattern = @EndPattern + 1
             -- Find end of pattern range
             WHILE PATINDEX(@Pattern, SUBSTRING(@InputString, @Next, @EndPattern)) > 0
                   AND @Len >= (@Next + @EndPattern - 1)
                SET @EndPattern = @EndPattern + 1
    
             --Either at the end of the pattern or @Next + @EndPattern = @Len
             SET @Result = @Result + @ReplaceText
             SET @Next = @Next + @EndPattern - 1
          END
       END
       RETURN(@Result)
    END
    

提交回复
热议问题