3

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

4

2 回答 2

3

没有表达式可以在一次选择中进行层次分配,但它可以像任何其他编程语言一样通过多个 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
于 2013-01-11T23:04:13.860 回答
-1

对于 SQL,这不是很重要,因为您最终在CASE WHEN子句中只有一个值。所以你需要做的就是重新安排你的条件。

在其他语言中,您执行一些存储在变量等中的计算,在SQL 中并非如此。

于 2013-01-11T23:08:23.497 回答