如何在存储过程中使用循环分割逗号分隔的字符串

时间:2011-11-21 16:42:25

标签: sql-server sql-server-2005 sql-server-2008

如何使用循环

拆分逗号分隔的字符串 例如: -

我有一个像4,3,5,2,5,9那样分隔的字符串

如果我想在不使用循环的情况下获得第3个逗号之后的字符串。

2 个答案:

答案 0 :(得分:1)

如果我们知道为什么你不能使用循环,那会有所帮助,但你可以使用自定义CLR函数(可能在幕后使用循环)或XQuery

DECLARE @S varchar(max),
  @Split char(1),
  @X xml

SELECT @S = '1,2,3,4,5',
  @Split = ','

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@S,@Split,'</s><s>') + '</s></root>')

SELECT [Value] = T.c.value('.','varchar(20)')
FROM @X.nodes('/root/s') T(c)

然后,只获得第三个(或任何你想要的序数)字符串,你可以使用基于ROW_NUMBER的解决方案来挑选你关心的行。

编辑:根据评论中的问题,这是一个检索第三个字符串的解决方案。由于您没有任何基于数据的排序强加,您必须伪造ROW_NUMBER订单。通常它不会让ORDER BY成为常量,但CASE语句可以解决这个问题。将WHERE iq.Ordinal = 3更改为您想要检索所需字符串的任何内容:

DECLARE @S varchar(max),
  @Split char(1),
  @X xml

SELECT @S = '1,2,3,4,5',
  @Split = ','

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@S,@Split,'</s><s>') + '</s></root>')

SELECT TOP 1 Value
FROM
(    
    SELECT [Value] = T.c.value('.','varchar(20)'), 
                ROW_NUMBER() OVER (ORDER BY 
                    CASE 
                        WHEN T.c.value('.', 'varchar(20)') = 0
                        THEN 0 
                        ELSE 0 
                    END ASC) AS Ordinal
    FROM @X.nodes('/root/s') T(c)
) iq
WHERE iq.Ordinal = 3

答案 1 :(得分:1)

DECLARE @str varchar(MAX)='001,002,03,0004,05,6,07'
    ,@separator char(1)=','
    ,@n int = 3;

WITH str_nums ( id, n1, n2 ) 
AS 
( 
SELECT CAST(1 as int) as id, CAST(0 as bigint) as n1, CHARINDEX(@separator, @str+@separator) as n2
UNION ALL
SELECT id + 1, n2 as n1, CHARINDEX(@separator, @str+@separator, n2+1) as n2
FROM str_nums
WHERE n2<len(@str)
) 

SELECT SUBSTRING(@str, n1+1, n2-n1-1) as n_str
FROM str_nums
WHERE id = @n
GO