【问题标题】:Checking the Oracle SQL DECODE function result against 0对照 0 检查 Oracle SQL DECODE 函数结果
【发布时间】:2021-12-29 16:02:03
【问题描述】:

我正在查看一些旧的 PL/SQL 代码,并且我有十几个这样编写的 DECODE 函数:

DECODE(value_1, value_2, 1, 0) = 0

现在,我知道这些 DECODE 会在 value_1value_2 之间进行比较,它们会根据比较结果返回 true 或 false。但是,出于对编码的热爱,有人可以告诉我 = 0 部分背后的逻辑是什么吗?为什么要检查返回值是否为 0?

【问题讨论】:

  • 检查 value_1 是否等于 value_2。然后,据我所知,它将结果与 0 进行比较,这让我很困扰。
  • 是的,应该是这样,但是代码中没有条件语句。
  • 大概这是 SQL 语句中 where 子句的一部分,并且仅与 PL/SQL 编程无关?也许最初的开发人员更喜欢它而不是更标准的case 语法,因为它简化了对空值的处理。不过,我们只是在没有更多上下文的情况下进行推测。

标签: sql oracle plsql decode


【解决方案1】:
  • 如果value_1 = value_2,则解码返回1
  • 否则返回0

因此,整个表达式会检查 value_1 是否与 value_2 不同,然后 - 我想 - 做某事

如果它是 PL/SQL 的一部分,您可以将其重写为

if value_1 <> value_2 then...

一些例子:

SQL> declare
  2    value_1 number := 5;
  3    value_2 number := 1;
  4  begin
  5    decode(value_1, value_2, 1, 0) = 0
  6  end;
  7  /
  decode(value_1, value_2, 1, 0) = 0
                                 *
ERROR at line 5:
ORA-06550: line 5, column 34:
PLS-00103: Encountered the symbol "=" when expecting one of the following:
:= . ( % ;


SQL> declare
  2    value_1 number := 5;
  3    value_2 number := 1;
  4  begin
  5    decode(value_1, value_2, 1, 0) = 0;
  6  end;
  7  /
  decode(value_1, value_2, 1, 0) = 0;
                                 *
ERROR at line 5:
ORA-06550: line 5, column 34:
PLS-00103: Encountered the symbol "=" when expecting one of the following:
:= . ( % ;
The symbol ":= was inserted before "=" to continue.


SQL> declare
  2    value_1 number := 5;
  3    value_2 number := 1;
  4  begin
  5    if decode(value_1, value_2, 1, 0) = 0 then
  6       null;
  7    end if;
  8  end;
  9  /
  if decode(value_1, value_2, 1, 0) = 0 then
     *
ERROR at line 5:
ORA-06550: line 5, column 6:
PLS-00204: function or pseudo-column 'DECODE' may be used inside a SQL statement only
ORA-06550: line 5, column 3:
PL/SQL: Statement ignored


SQL> declare
  2    value_1 number := 5;
  3    value_2 number := 1;
  4  begin
  5    case when decode(value_1, value_2, 1, 0) = 0 then
  6         null;
  7    end case;
  8  end;
  9  /
  case when decode(value_1, value_2, 1, 0) = 0 then
            *
ERROR at line 5:
ORA-06550: line 5, column 13:
PLS-00204: function or pseudo-column 'DECODE' may be used inside a SQL statement only
ORA-06550: line 5, column 3:
PL/SQL: Statement ignored


SQL> declare
  2    value_1 number := 5;
  3    value_2 number := 1;
  4    l_decode_result number;
  5  begin
  6    select decode(value_1, value_2, 1, 0)
  7      into l_decode_result
  8      from dual;
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 是的,没错,但是用 0 检查 DECODE 结果呢?
  • 怎么样?该代码的作者决定 - 出于某种原因 - 检查 DECODE 是否返回 0 并且 - 如果返回 - 执行一些操作。我不知道是哪一个,因为您没有在围绕那个 DECODE 发布任何上下文。
  • 谢谢,但我只能在整个代码中找到它背后的任何逻辑。它只是没有任何条件语句。
  • 好吧,您发布的声明无法独立存在。这是没有意义的,并且会引发错误。 DECODE 只能在 SQL 语句中使用。
  • 不客气。我发布了一堆示例,表明 DECODE 不能以不适当的方式使用;看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多