return 来自 SQL 服务器的空结果集的简洁语法

Terse syntax to return an empty result set from SQL server

有没有更短的写法?

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

接下来是 "original" 问题。这被修改了很多次,明确希望由于显示特定的 use-case 而停止 Y 响应;并且[正确地]声称是一团混乱。

use-case 是一个 TSQL 查询,在某些情况下 return 是空结果集,而在另一种情况下是 'real' 结果集。在这两种情况下,结构应该是相同的。

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

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

一种方法如下。有句法'simpler'方法吗?

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

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

-- 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'

是的,'simpler'/更短/更简洁的语法可以在 SQL 服务器中返回空结果集,不需要先创建派生 table。

-- select empty_result
select top 0
  1 as col

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


虽然没有专门针对较短的空结果集语法,但 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