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))
答案 0 :(得分:3)
没有表达可以在一个选择中执行Hierarchal赋值,但它可以像任何其他编程语言通过多个if语句一样实现
DECLARE @flag1 BIT = 1, @flag2 BIT = 0, @flag3 BIT = 1, @decision VARCHAR(50)
IF @flag1 = 1 AND @flag2 = 0
SET @decision = 'LEFT'
IF @flag1 = 0 AND @flag2 = 0
SET @decision = 'NONE'
IF @flag2 = 0 AND @flag3 = 1
SET @decision = 'RIGHT'
SELECT @decision
答案 1 :(得分:-1)
对于SQL,这不是很重要,因为在CASE WHEN
子句中只有一个值。所以你需要做的就是重新安排你的条件。
在其他语言中,您执行一些存储在变量等中的计算,在 pure SQL中则不是这样。