oracle - 甲骨文解码和 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 函数在这里如何工作?
解决方案
函数在这里如何
DECODE
工作?
DECODE
是CASE
语句的基于函数的等价物。
您的代码相当于:
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 和NVL
s 展开为:
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
和 returnNA
。
推荐阅读
- python - 如何使用 stringvar 分配 tkinter.scale 的属性?
- react-native - webview.goBack() 抛出错误:UIManager.dispatchViewManagerCommand 有 2 个参数,预期为 3 - React Native
- java - 我可以用哪个符号替换 "expected should equal("""anyInt - anyInt - anyInt""")" 中的 anyInt
- regex - Google Data Studio 中的 REGEXP_EXTRACT 特定字符串
- java - 找到 a[i] 和 a[j] 之间的最大可能差异,其中 0 < i < a.length 和 i < j < a.length
- google-cloud-platform - 通过谷歌云 NAT 访问互联网时出现明显延迟
- haskell - flycheck-haskell 和 doctest 不适用于 Cabal 3.0 v2-build 项目
- graphite - 为什么即使在所有数据都到达 Graphite DB 之后,Graphite UI 也不显示数据?
- c# - 如何在 C# 桌面应用程序中保存登录凭据(用户名、密码)?
- php - 将其中包含对象的数组转换为 Json