2015-11-24 2 views
1

Вот FonzSummary, чтобы помочь в понимании вопроса - Правильно: http://imgur.com/5eLJCgv, Неправильно: http://imgur.com/a0Ssp0eКак настроить выход быть EMPTY, в настоящее время показывает ROW

Издание: У меня возникли некоторые проблемы с отображением пустой выход ... I хочу вывод не отражает абсолютно ничего, если результатов нет, но до сих пор я не увенчался успехом.

SET @AddedOutput = 
CASE WHEN @AddedList IS NULL THEN NULL 
ELSE 'Kids added to Santas Naughty List'[email protected] 
END 

SET @RemovedOutput = 
CASE WHEN @RemovedList IS NULL THEN NULL 
ELSE 'Kids removed from Santas Naughty List'[email protected] 
END 

--Final Output 
SELECT CASE 
WHEN @AddedOutput IS NULL THEN (SELECT TOP 0 NULL) 
ELSE @AddedOutPut END as 'List Changes' 
UNION 
SELECT CASE 
WHEN @RemovedOutput IS NULL THEN (SELECT TOP 0 NULL) 
ELSE @RemovedOutput END as 'List Changes' 

Чтобы еще более усложнить вещи, как только я добавил (Select TOP 0 NULL) на мой прок, действительные результаты больше не работают! Почему это делает попытку конвертировать в Int? Я знаю, что результаты не будут Int!

Msg 245, Level 16, State 1, Procedure SantaList_TEST, Line 72 
Conversion failed when converting the varchar value 'Kids added 
to Santas Naughty List 27065, 28538, 28539' to data type int. 
+0

Тег dbms used! Это не похоже на ANSI SQL ... – jarlh

ответ

0

У вас есть два подзапроса, каждый из которых возвращает одну строку. Выход будет иметь одну или две строки. Один метод должен были бы сделать:

SELECT t.* 
FROM (SELECT @AddedOutPut as ListChanges 
     UNION 
     SELECT @RemovedOutput as ListChange 
    ) t 
WHERE ListChanges IS NOT NULL; 

THEN (SELECT TOP 0 NULL) в вашем CASE заявления является доблестной попыткой попробовать, чтобы получить ни одной строки. Однако статья FROM (вместе с предложениями WHERE, GROUP BY, HAVING и FETCH/TOP) действительно определяет, какие строки возвращаются. В качестве скалярного подзапроса используется (SELECT TOP 0 NULL). Если он ничего не возвращает, то SQL помещает NULL, следовательно, радикальное упрощение вашего запроса.

Кроме того, я сомневаюсь, что UNION действительно необходим в этом случае. Это приводит к накладным расходам для удаления дубликатов. По привычке лучше научиться использовать UNION ALL, если вы действительно не хотите нанести накладные расходы.

+0

Гордон, я очень ценю время, которое вы приняли, чтобы объяснить это. Это демонстрирует гораздо более красноречивое решение, которое определенно поможет мне продвинуться вперед. –

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