2015-01-07 6 views
-1
DECLARE @result varchar(max) 

SELECT  
    @result = coalesce(@result + ',', '') + Mobile 
FROM  
    VMembers 
WHERE 
    CommitteesID = 45 

Я думаю, если он проверяет нуль Mobile, он должен бытьНе может понять, почему это работает (сливается)

DECLARE @result varchar(max) 

SELECT  
    @result = @result + ISNULL(Mobile + ',', '') 
FROM  
    VMembers 
WHERE 
    CommitteesID = 45 

Но это всегда дает @result = NULL. Я не понимаю, почему первый работает, а второй не работает.

+1

@result изначально NULL. Добавление sth в NULL дает всегда NULL –

+0

'@result = @result + ISNULL (Mobile + ',', '')': NULL + любая строка = null, но в этом случае это не то же самое. –

+0

@GiorgosBetsos так, почему первый работает –

ответ

1

Первая версия проверяет @result на NULL, что является правильным, поскольку оно начинается с NULL. Ваша версия всегда будет возвращать NULL, потому что @result начинается как NULL.

Код не проверяет: Mobile для NULL.

Можно также инициализировать значение, выполнив:

DECLARE @result varchar(max) = ''; 

SELECT @result = @result + ',' + Mobile 
FROM VMembers 
WHERE CommitteesID=45 

Однако, что бы положить ненужную запятой в начале строки.

Позвольте мне заметить: это не мой предпочтительный метод для создания агрегации строк, но он, похоже, работает.

1

Ни один из ваших запросов никогда не инициализирует @result, что означает, что @result имеет значение NULL до начала запроса.

В первом запросе это обрабатывается @result внутри оператора COALESCE, который выводит '', когда @result имеет значение NULL. Это не происходит во втором запросе, поэтому выход всегда будет NULL (помните, что при конкатенации строк NULL + «независимо» всегда равно NULL).

Смежные вопросы