两个“IF”块之间的区别

Posted

技术标签:

【中文标题】两个“IF”块之间的区别【英文标题】:Difference between two "IF" blocks 【发布时间】:2013-12-16 06:00:31 【问题描述】:

1)

DECLARE
  total_sales number := 10;
  no_revenue  BOOLEAN;
BEGIN
  IF total_sales <= 0 THEN
    no_revenue := TRUE;
  ELSE
    no_revenue := FALSE;
  END IF;
END;

2)

DECLARE
  total_sales number := 10;
  no_revenue  BOOLEAN;
BEGIN
  IF total_sales <= 0 THEN
    no_revenue := TRUE;
  ELSIF total_sales > 0 THEN
    no_revenue := FALSE;
  END IF;
END;

在性能方面哪个更好?为什么?

PS。与total_sales的值无关

【问题讨论】:

你的块在语义上是不同的,因为如果total_sales 为空,第二个块不会分配no_revenue 【参考方案1】:

在您的特定情况下没有区别 - 两个块会给您相同的结果。但是,IF 构造是不同的,您应该注意操作数的值以及您在条件中使用的比较运算符,因为第一个 IF 块的 else 子句将捕获所有不符合IF 条件。在第二个 IF 块中,您更加具体,只有当两个条件之一为真时,no_revenue 变量的值才会更改。

在性能方面,最好完全摆脱 IF 块,在这种特殊情况下并重写该逻辑如下:

no_revenue  := (total_sales <= 0);

【讨论】:

【参考方案2】:

我会说#1 更快,因为它不必在 elseif 中找到额外的“total_sales > 0”的结果

【讨论】:

【参考方案3】:

我相信在第一个中,如果 total_sales 为 NULL no_revenue 将为 false,在第二个中代码会中断,因为在任何 IF 之间都找不到 NULL。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于两个“IF”块之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

EntityDbContext SaveChanges:这两个代码之间有什么区别?

带有等待/通知和没有它们的同步块之间的区别?

两个冒泡排序循环之间的实际区别

一两个“if”语句之间的差异

使方法同步或在方法中添加同步块之间有区别吗? [复制]

if:else:和if:continue之间的区别