首页 > 解决方案 > 从 SQL 服务器返回空结果集的简洁语法

问题描述

是否有更短的方法来编写以下内容?

-- select empty_result
select t.col
from (select 1 as col) t
where 1 = 0 -- never match

“原始”问题如下。这可能会被修改多次,明确希望由于显示特定用例而停止 Y 响应;并且[正确地]声称这是一个令人困惑的混乱。

用例是一个 TSQL 查询,在某些情况下返回空结果集,而在另一种情况下返回“真实”结果集。在这两种情况下,结构都应该是相同的。

 if @foo = 'bar'
   -- select real_result
 else
   -- select empty_result

那么这里的问题是,特别是关于简单地创建一个空的结果集/派生表。

一种方法如下。有语法上“更简单”的方法吗?

-- select empty_result
select t.col
from (select 1 as col) t
where 1 = 0 -- never match

在这个特定的 MINIMAL IF..ELSE..CASE 中的替代方案,它可以构造为以下 SQL。它在问题范围之外(XY),即使它在此处起作用,因为生成的架构与上面的示例相同。虽然它在其他地方可能是一个不错的选择,但它需要不同的 TSQL 流控制结构。如果两种情况导致不同的模式,它也不会返回正确的结果集 - 使其在标题范围方面过于具体。

-- XY alternative specific to MINIMAL CASE shown above
-- select real_result or empty_result with single query
select t.col
from real_data t
where @foo = 'bar'

标签: sqlsql-serversyntaxsql-server-2014derived-table

解决方案


是的,有一个“更简单”/更短/更简洁的语法来返回 SQL Server 中的空结果集,不需要首先创建派生表。

-- select empty_result
select top 0
  1 as col

这是 SQL Server 特定的语法。在其他数据库实现中可能还有其他类似的形式。


虽然没有专门针对较短的空结果集语法,但 Ken White 提供了一种方法,如果在两种情况下都相同,则可以避免重复模式。根据原始问题,保留了IF 流控制结构。

if @foo = 'bar'
  -- select real_result
  select t.col
  from real_table t
else
  -- select empty_result
  select t.col
  from real_table t
  where 1 = 0

推荐阅读