【发布时间】:2012-12-26 14:29:58
【问题描述】:
SQL 是否同时具有短路和分层多重评估语法?
短路分配示例。这里decision 在 ... 为真时获取 FIRST *** 子句:
短路
case
when (...) then (***)
when (...) then (***)
when (...) then (***)
else (...)
end as decision
分层分配示例。这里decision 在 ... 为真时获取 LAST *** 表达式。
分层
if (...) then (decision = ***) end
if (...) then (decision = ***) end
if (...) then (decision = ***) end
相互转化
很明显,颠倒表达式的顺序会在分层和短路之间切换。我想知道 SQL 是否也有一个可以分配 LAST tr 表达式的构造?
测试用例:
下面给出一个非常简单的玩具例子:
select
flag1, flag2, flag3,
case
when flag1=1 and flag2=0 then 'LEFT'
when flag1=0 and flag2=0 then 'NONE'
when flag2=0 and flag3=1 then 'RIGHT'
end as decision
FROM
( select
1 as flag1, 0 as flag2, 1 as flag3
-- from dual -- if you use Oracle
) tmp ;
短路 SQL 将返回 'LEFT'
分层分配将返回“RIGHT”。
编辑:您可以通过单击链接在SQL-Fiddle 中运行此示例。 (感谢 ypercube 指出这个有用的网站!(+1))
【问题讨论】:
-
最后一个例子很好(但它会在 SQL 中出错)。
-
@ypercube:我在 Teradata SQL 中成功运行它并验证它给出了 LEFT。然后在 flag1 设置为 0 的情况下再次运行它,它返回 NONE... 这肯定证实了 SQL 的 case/when 构造是短路的。你用什么 SQL 运行它?它给了你什么错误?
-
试试 SQL-Fiddle 所有 4 个 DBMS(SQL-Server、Postgres、Oracle、MySQL)都会导致错误(您的查询是第二个)。跨度>
-
@AKE 对于oracle,您缺少
from table.. -
嗯,你说得对。显然,Teradata 在接受的方面相当随和!太糟糕了,SQL-Fiddle 中没有 Teradata 选项。我将编辑该示例,使其在 SQL-Fiddle 中工作。
标签: sql tsql conditional conditional-statements teradata