如果未找到任何结果,请在查询结果中添加空行

Chr*_*son 22 sql t-sql sql-server sql-server-2005

我正在编写由遗留系统调用的存储过程.遗留系统的一个约束是从存储过程返回的单个结果集中必须至少有一行.标准是在第一列中返回零(是的,我知道!).

实现此目的的显而易见的方法是创建临时表,将结果放入其中,测试临时表中的任何行,并从临时表或单个空结果返回结果.

另一种方法可能是在执行主查询之前对主查询中的相同where子句执行EXISTS.

这些都不令人满意.任何人都可以想到更好的方法.我正在考虑UNION这样的行(我知道这不起作用):

--create table #test
--(
--  id int identity,
--  category varchar(10)
--)
--go
--insert #test values ('A')
--insert #test values ('B')
--insert #test values ('C')

declare @category varchar(10)

set @category = 'D'

select
    id, category
from #test
where category = @category
union
select
    0, ''
from #test
where @@rowcount = 0
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 29

我很害怕,很少有选择.

您总是需要触摸两次表,无论是COUNT,EXISTS,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)
Run Code Online (Sandbox Code Playgroud)

EXISTS解决方案比COUNT更好,因为它会在找到行时停止.COUNT将遍历所有行以实际计算它们

  • 如果您不想重复很长的复杂查询,则可以执行以下操作:`;其中cte AS(...)... SELECT * FROM cte UNION ALL SELECT 0,''WHERE NOT EXISTS(SELECT TOP 1 * FROM cte)` (2认同)

swe*_*swe 12

这是一个老问题,但我遇到了同样的问题.解决方案非常简单,没有双重选择:

select top(1) WITH TIES * FROM (
select
id, category, 1 as orderdummy
from #test
where category = @category
union select 0, '', 2) ORDER BY orderdummy
Run Code Online (Sandbox Code Playgroud)

通过"WITH TIES"你得到所有行(所有行都有1作为"orderdummy",所以都是关系),或者如果没有结果,你得到你的默认行为.