sql - 从 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'
解决方案
是的,有一个“更简单”/更短/更简洁的语法来返回 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
推荐阅读
- c++ - 如何仅使用 ctrl z 结束程序
- python - Python for循环和if在文本中查找字符串
- windows - 在 postgres 12 中定期删除存档的 Wal 文件
- variables - 布尔变量作为模板参数输入
- javascript - TypeError: undefined is not an object (evlauating 'newData[0].flag')
- python - 如何将索引列表转换为python中的x,y坐标
- python - 我正在获取图像并希望将图像保存在单个 pdf 文件中
- python - 是否可以根据输入本身将 raw_input 的类型设为整数或字符串?
- android - 在约束布局中稍微向下调整我的按钮
- laravel - Blade @props 覆盖传递的属性值