【问题标题】:Oracle DECODE and NVL甲骨文解码和 NVL
【发布时间】:2021-08-05 08:29:49
【问题描述】:

我正在尝试分析现有的 oracle 查询。我对Oracle不太熟悉,在DECODE函数中使用这个NVL函数有点困惑

Select 
DECODE (DECODE(NVL(tab.id,0),0,0,1)+ DECODE (NVL(tab2.id,0),0,01), 2,'two', 0,'none',
DECODE (DECODE (NVL(tab2.id,0),0,0,1),1,'one','NA')
) Result

这些表格包含以下值。

Tab
count   id
1   1111
0   null
1   2222
1   3333
1   4444
1   5555
    
tab2    
count   id
1   1111
1   3333
1   6666
1   2222
0   null

DECODE 函数在这里如何工作?

【问题讨论】:

  • 我假设您有错字,DECODE (NVL(tab2.id,0),0,01) 应该是 DECODE (NVL(tab2.id,0),0,0,1)

标签: oracle


【解决方案1】:

DECODE 函数在这里如何工作?

DECODECASE 语句的基于函数的等效项。

您的代码相当于:

Select CASE DECODE(NVL(tab.id,0),0,0,1)
            + DECODE (NVL(tab2.id,0),0,0,1),
       WHEN 2 THEN 'two'
       WHEN 0 THEN 'none'
       ELSE DECODE(DECODE (NVL(tab2.id,0),0,0,1),1,'one','NA')
       END AS Result

然后您可以将嵌套的DECODEs 和NVLs 展开为:

Select CASE CASE
            WHEN tab.id IS NULL OR tab.id = 0 THEN 0
            ELSE 1
            END
            +
            CASE
            WHEN tab2.id IS NULL OR tab2.id = 0 THEN 0
            ELSE 1
            END,
       WHEN 2 THEN 'two'
       WHEN 0 THEN 'none'
       ELSE CASE CASE
                 WHEN tab2.id IS NULL OR tab2.id = 0 THEN 0
                 ELSE 1
                 END
            WHEN 1 THEN 'one'
            ELSE 'NA'
            END
       END AS Result

英文:

  • 如果tab.idtab2.id 的值为零或NULL,则将它们分别转换为零,或者转换为一,然后将这两个值相加。
  • 如果它们的总数为零或二,则以单词形式返回总数。
  • 如果它们的总数为 1,则单独检查 tab2.id 值,如果其值不为零或 NULL,则返回(以文字形式)one
  • 否则,一定是tab.id不为零或NULL并返回NA

【讨论】:

  • 非常感谢。我现在理解了这个查询的功能,我尝试使用嵌套的 case 语句并获得预期的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2014-08-02
  • 2012-07-03
  • 2011-05-13
  • 2016-04-26
相关资源
最近更新 更多