Создание списка, разделенного запятыми?
Я пытаюсь использовать 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, пригодного для проверки этого, поэтому он из памяти. Возможно, вам придется играть с параметрами материала и т.д., Чтобы заставить его работать именно так, как вы хотите.
Ответ 2
COALESCE Возвращает первое ненулевое выражение среди своих аргументов
Первый аргумент @output + ', '
никогда не является нулевым (если вы не инициализируете @output
как null И установите CONCAT_NULL_YIELDS_NULL
в ON
), поэтому он всегда возвращался.
Ответ 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