首页 > 解决方案 > 甲骨文解码和 NVL

问题描述

我正在尝试分析现有的 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 函数在这里如何工作?

标签: oracle

解决方案


函数在这里如何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

然后,您可以将嵌套DECODE的 s 和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.id将和中的每一个都tab2.id转换为零,如果它们的值是零或NULL,或 ,然后将两个值相加。
  • 如果它们的总数为零或二,则以单词形式返回总数。
  • 如果它们的总数为 1,则tab2.id自行检查该值,如果其值不为零,NULL则返回(以文字形式)one
  • 否则,它一定tab.id是 不为零 orNULL和 return NA

推荐阅读