пятница, 11 декабря 2009 г.

Вывод результата выборки в строчку: FOR XML PATH

Бывает необходимость вывести результат выборки в строчку.
Рассмотрим на примере. Есть задача и список исполнителей, необходимо построчно вывести задачи и ответственных. В случае группировки по задаче, ответственному мы получим число записей = число задач * число ответственных, нам же требуется вывести задачи построчно. Это отлично реализуется с помощью инструкции MS SQL - FOR XML PATH, изначально используемой для формирования xml строки из выборки.

Пример кода: task - Задачи, executer - Исполнитель:
SELECT
e.name, -- название задачи
(SELECT t.name + ', ' -- список исполнителей для задачи через запятую
 FROM task t
 WHERE t.executor = e.id
 FOR XML PATH(''))
FROM executer e

Рассмотрим более интересный пример, более близкий к изначальному применению FOR XML PATH - сформируем CSV файл из таблицы одним запросом без всяких циклов:
SELECT
t.field1 + ';' + --объединяем список столбцов через разделитель
t.field2 + ';' +
t.field3 + ';' +
t.field4 + ';
' --перенос строки
FROM table t WHERE 1=1 FOR XML PATH('')
Если field не строка, то его нужно привести: CAST(field AS VARCHAR(50)).

Добавление для ORACLE
SELECT t.executor, wmsys.wm_concat(t.name) 
FROM FROM task t 
GROUP BY t.executor

3 комментария:

  1. Стоит отметить, что в Oracle wm_concat - недокументированная функция. В production использовать её - моветон.
    Да и еще. При переходе с версии 10 на 11 её поведение немного поменялось...

    ОтветитьУдалить
  2. Спасибо за пример с XML PATH('') -пригодилось!)

    ОтветитьУдалить
  3. Доступно и информативно, спасибо.

    ОтветитьУдалить