Очень простое решение.
Это старый вопрос, но у меня была такая же проблема. Решение действительно простое, БЕЗ двойного выбора:
select top(1) WITH TIES * FROM (
select
id, category, 1 as orderdummy
from #test
where category = @category
union select 0, '', 2) ORDER BY orderdummy
с помощью «С TIES» вы получаете ВСЕ строки (все имеют 1 как «orderdummy», так что все являются связями), или если результата нет, Вы получаете свою стандартную сумму.
Боюсь, вариантов очень мало.
Вы всегда должны касаться таблицы дважды, будь то COUNT, EXISTS до, EXIST в UNION, предложение TOP и т. Д.
select
id, category
from mytable
where category = @category
union all --edit, of course it's quicker
select
0, ''
where NOT EXISTS (SELECT * FROM mytable where category = @category)
Решение EXISTS лучше, чем COUNT, потому что оно остановится, когда найдет строку. COUNT будет проходить по всем строкам, чтобы фактически подсчитать их
Думаю, вы можете попробовать:
Declare @count int
set @count = 0
Begin
Select @count = Count([Column])
From //Your query
if(@Count = 0)
select 0
else //run your query
Недостаток в том, что вы выполняете запрос дважды, плюс в том, что вы пропускаете временную таблицу.