Создание списка, разделенного запятыми?

Я пытаюсь использовать SQL для создания разделенного запятыми списка cat_id

код:

declare     @output varchar(max)
set         @output = null;
select @output = COALESCE(@output + ', ', '') + convert(varchar(max),cat_id)

изменить: изменить '' на null, STILL же. но вывод im im выглядит так:

, 66 , 23

ведущей запятой не должно быть. Что я пропустил?

Ответ 1

Вы работаете на SQL 2005? С реквизитом Роб Фарли, который показал мне это совсем недавно:

SELECT stuff((
    SELECT ', ' + cast(cat_id as varchar(max))
    FROM categories
    FOR XML PATH('')
    ), 1, 2, '');

Внутренний запрос (с помощью FOR XML PATH('')) выбирает список идентификаторов категорий, разделенный запятыми, с ведущим ",". Внешний запрос использует функцию stuff для удаления ведущей запятой и пробела.

У меня нет экземпляра SQL, пригодного для проверки этого, поэтому он из памяти. Возможно, вам придется играть с параметрами материала и т.д., Чтобы заставить его работать именно так, как вы хотите.

Ответ 3

declare     @output varchar(max)

select      @output = coalesce
                      ( 
                          @output + ', ' + convert(varchar(max),cat_id), 
                          convert(varchar(max),cat_id)
                      )
from        yourTableHere

print       @output

Ответ 4

Проверить значение @output непосредственно перед выполнением этого запроса, я думаю, что он не равен NULL, а к '' (пустая строка)

EDIT: (после того, как @auth отредактировал вопрос)

теперь я уверен, что это '',

вам нужно инициализировать его до NULL

чтобы сделать это независимо от CONCAT_NULL_YIELDS_NULL, используйте старый CASE WHEN:

select @output = NULL
select @output = CASE WHEN @output IS NULL THEN '' ELSE @output+', ' END + value

Ответ 5

Вы инициализировали @output пустую строку? COALESCE будет работать, только если это строка NULL.

Ответ 6

То, что вы делаете неправильно, это то, что @output не пуст с начала, а пустая строка. Установите @output в null до цикла (или если он не используется, поскольку он объявлен, просто не присваивает ему пустую строку).

Ответ 7

И иногда...

вы должны ответить на свой вопрос

declare     @output varchar(max)
select      @output = case when (@output is null) then '' else ', ' END + convert(varchar(max),cat_id)

Ответ 8

Не уверен, что это относится именно к тому, что вы ищете, но я нашел это правильно, в то же время я нашел ваши вопросы. Я использую второе решение с FOR XML PATH, о котором упоминал Мэтт Гамильтон. Это отлично поработало для меня.

Конкатенация строк - Карл П. Андерсон, 2009/10/14

http://www.sqlservercentral.com/articles/T-SQL/67973/

Ответ 9

/osp/install/idp/bin/sqlminus "select ri || ',' ||name|| ',' || numports || ',' || ascii(OVRONSET) from sdfctigw.ivrgrp where GRP_BEP is not null;" | sort -h
1,COMO INTERNAL 2,700,90
7,LOADIVR,10,80
10,SPEECH_IVR_PROD,600,95