【问题标题】:Can Oracle PL/SQL evaluate an integer as a boolean value?Oracle PL/SQL 可以将整数评估为布尔值吗?
【发布时间】:2013-08-23 17:22:40
【问题描述】:

给定v_ssn_ind INTEGER := IF TRIM(p_ssn) IS NULL THEN 0 ELSE 1 END IF;

我知道我可以这样做:IF v_ssn_ind=1 THEN…

但是我可以做短路评估吗,即:IF v_ssn_ind THEN…

【问题讨论】:

  • 而且,对于奖励积分,它是更快还是更慢?
  • 表达式 IF v_ssn_ind THEN 没有意义(如果我没记错的话也不会编译),除非 v_ssn_ind 被声明为布尔值。

标签: plsql oracle11g


【解决方案1】:

首先,您所说的似乎与short-circuit evaluation 没有任何关系。短路评估将是当代码像

IF( quick_condition AND slow_condition )
THEN
  <<do something>>
END IF;

当且仅当初始快速条件评估为 TRUE 时,才评估第二个慢速条件。

其次,您为v_ssn_ind 分配的值在语法上无效。

第三,不,你不能说

IF <<integer variable>>
THEN

因为那没有意义。什么值将评估为 TRUE,什么值将评估为 FALSE?例如,如果 0 为 FALSE,1 为 TRUE,那么 17 会转换成什么?

如果您要声明某种指示变量,通常使用BOOLEAN 数据类型而不是整数是有意义的。如果你使用布尔值,那么你可以做

IF <<boolean variable>>
THEN

因为这消除了歧义。但是,这不会比将= TRUE 添加到您的 IF 条件更快。

【讨论】:

  • 好的,我将编辑标题帖子并提出问题——什么比“短路评估”更合适?
【解决方案2】:

我不鼓励您将任何逻辑放入声明块中,我认为这会使代码变得不那么清晰。

您可以使用CASE 语句代替IF

...
    v_ssn_ind INTEGER;
BEGIN
    v_ssn_ind := CASE TRIM(p_ssn) IS NULL WHEN TRUE THEN 0 ELSE 1 END;
...

但我个人会为v_ssn_ind选择BOOLEAN类型

...
    v_ssn_ind BOOLEAN;
BEGIN
    v_ssn_ind := TRIM(p_ssn) IS NOT NULL;
...

【讨论】:

  • 就个人而言,我希望名为“_ind”的变量引用某种索引。或许将变量重命名为 v_ssn_is_not_null 之类的名称会更有意义。
  • 你是对的,它会给变量的名字带来更多的意义。
  • @JeffreyKemp: _ind 是指标的缩写;在我的第一份工作中,它是布尔变量的建议附件。
  • 很公平。正如我所说,这是个人的事情——“指标”并不是我脑海中第一个蹦出来的东西 :) 最终,一致性将是最重要的因素,而不是实际使用的后缀或前缀。
猜你喜欢
  • 2010-12-25
  • 2011-07-31
  • 2012-11-22
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多