如果没有找到结果,则在查询结果中添加空行

新手上路,请多包涵

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

实现这一点的明显方法是创建一个临时表,将结果放入其中,测试临时表中的任何行,然后从临时表中返回结果或返回单个空结果。

另一种方法可能是在执行主查询之前对主查询中的相同 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

原文由 Chris Simpson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

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

通过“WITH TIES”,您将获得所有行(所有行都有 1 作为“orderdummy”,所以都是平局),或者如果没有结果,您将获得默认行。

原文由 swe 发布,翻译遵循 CC BY-SA 3.0 许可协议

为了避免重复选择查询,临时表先存储查询结果如何?并基于临时表,如果临时表为空,则返回默认行,或者在有结果时返回临时表?

原文由 JieLi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进