SQL中的分层与短路分配?

时间:2013-01-11 22:35:23

标签: sql tsql conditional conditional-statements teradata

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

2 个答案:

答案 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中则不是这样。