回答

收藏

空结果集的集合

技术问答 技术问答 190 人阅读 | 0 人回复 | 2023-09-14

我希望将空结果集的总计设置为0。我尝试了以下方法:% W  n6 p7 A* p: C/ M; e7 E
SELECT SUM(COALESCE(capacity, 0))
$ V  |" r% M8 }7 O( F4 ~- p  FROM objects! i# V& h1 n. U/ f. ]: c
WHERE null IS NOT NULL;
! u# n, l! r% f! ?& b+ j结果:0 I7 E$ V: \& {) y# L
sum ; `% G' z( c  L6 \
-----
% d1 s3 n4 |! J7 u9 b(1 row)
0 c4 I6 S/ }( A! R" u$ g, s子问题:上面的工作在Oracle中行不通SUM(NVL(capacity, 0))吗?
- T! u& @" y0 @: s  I) S9 e                3 R& K- k: ~7 }% \, h% B) [8 l8 `
解决方案:
/ \( I) [% q( L+ S7 [; R& ^( c                ( ]8 U( L1 b  }! G" j$ _  w2 b( t; ?4 `

; G0 m0 O5 [+ b& A/ ?9 w2 Q% o0 i2 B1 k( s8 F" ?* J$ f5 ]0 F
                在有关聚合函数的文档页面中:
9 d* @. Z4 |. f9 S4 c: ]" j1 ^6 I' b
应该注意的是,除了count这些函数, 当没有选择任何行时 ,这些函数将 返回空值' U5 e; E* b4 F$ x) b" Z7 F  Q
。特别是,sum没有行返回空值,而不是预期的零值。coalesce必要时,该函数可用于将零替换为null。
) X) S2 Z0 u$ Z9 Y
9 \4 I/ e" a( M  r- b, N4 V% l所以,如果你想保证返回的值,适用COALESCE于 结果 的SUM,而不是它的参数:
# x3 p, b' T- X3 r% h, USELECT COALESCE(SUM(capacity), 0) 鈥?" z4 U8 N* P/ J
至于Oracle的“子问题”,我在官方文档页面(尤其是10.2的页面)上找不到任何NULL的概念,但是另外两个明确的来源:# {8 C* W  Z, ]3 V1 E/ P) ]/ p
Oracle SQL函数:2 a" U; t' u" T; s: Q; l! }( l
; `! A2 T8 M. i" f/ N
SUM([DISTINCT] n)n的值之和, 忽略NULL2 L' U/ J" [, u" I0 `

0 ?2 d, O$ f; M! f: U' ~. ysum聚合函数[Oracle SQL]:+ p0 A1 F  T, F8 a$ y. t
. X6 D8 Z+ a3 J
“ fa sum()在某些数字上创建, 忽略空值 ,如以下示例所示”。7 w, k  D) l. W1 M$ l
) H  H4 O0 S0 `+ j! [- a0 C
也就是说,您无需将NVL应用于capacity。(但是,就像COALESCE在PostgreSQL中一样,您可能希望将其应用于SUM。)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则