Вы не указали, что произойдет, если после строки замены будет строка.Я предположил, что если после строки что-то есть другая строка, вы хотите, чтобы она была добавлена в строку.Я добавил строку «Something4» в ваши тестовые данные в качестве примера.
Вы можете игнорировать любые данные перед последней заменой, поэтому вам нужно выяснить, где находится (последняя) замена, и запускать только оттуда.Если нет замены, тогда вы получите все.Приведенный ниже пример даст вам «, Something3, Something4»
With Testdata as (
select 'Condition1' value, '0' replace, 1 [order]
UNION ALL
select 'State2' value, '0' replace, 2 [order]
UNION ALL
select 'Something3' value, '1' replace, 3 [order]
UNION ALL
select 'Something4' value, '0' replace, 4 [order]
)
Select (
select ', ' + value
From Testdata
Where [order] >= ISNULL((Select MAX([order]) from Testdata where replace = 1) ,0)
for xml path('')) as result
EDITED: версия без CTE (с) - просто замените каждый вызов TestData всем содержимым CTE (с разделом WITH), например, так,Я уверен, что вы могли бы немного оптимизировать второй подзапрос, в зависимости от того, как он соединяется с родителем, но этот метод грубой силы работает.
Select (
select ', ' + value
From (
select 'Condition1' value, '0' replace, 1 [order]
UNION ALL
select 'State2' value, '0' replace, 2 [order]
UNION ALL
select 'Something3' value, '1' replace, 3 [order]
UNION ALL
select 'Something4' value, '0' replace, 4 [order]
) a
Where [order] >=
ISNULL((Select MAX([order]) from (
select 'Condition1' value, '0' replace, 1 [order]
UNION ALL
select 'State2' value, '0' replace, 2 [order]
UNION ALL
select 'Something3' value, '1' replace, 3 [order]
UNION ALL
select 'Something4' value, '0' replace, 4 [order]
) b
where replace = 1) ,0)
for xml path('')) as result