如何使用循环
拆分逗号分隔的字符串 例如: -我有一个像4,3,5,2,5,9那样分隔的字符串
如果我想在不使用循环的情况下获得第3个逗号之后的字符串。
答案 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