Включая пользовательскую логику при объединении значений из нескольких строк - PullRequest
0 голосов
/ 04 июня 2018

Я работаю с SQL Server 2008.

Я создаю динамический sql следующим образом (который на самом деле является подзапросом в другом выборе, который я в конечном итоге «выполняю»; запрос упрощен для краткости):

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]     )   temptbl 
      for xml path('')) as Result

... и это правильно возвращает столбец Result со значениями, такими как: ', Condition1, Something3' и т. Д.

Однако вместо этогопросто добавив ВСЕ значения в моих строках temptbl, я хочу «заменить» вместо «добавить», когда я сталкиваюсь с replace = '1' (как в 3-й строке выше).

Итак, если вы выполните вышеизложенное, вы получите: ', Condition1, State2, Something3'

Вместо этого мне нужно 'Something3', потому что replace = 1 в 3-й строке выше.

Возможно ли это?

1 Ответ

0 голосов
/ 05 июня 2018

Вы не указали, что произойдет, если после строки замены будет строка.Я предположил, что если после строки что-то есть другая строка, вы хотите, чтобы она была добавлена ​​в строку.Я добавил строку «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...