Было бы полезно, если бы мы знали , почему вы не можете использовать цикл, но вы можете использовать пользовательскую функцию 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