我们有一个在NVL语句中使用大小写的查询 但是我认为NVL可以删除
请参考下面查询的一部分-
unsigned long (long) int
我们也可以通过这样写来避免NVL
select f1, NVL((
CASE
WHEN PROD_CD = 'ESALE'
THEN SUM (prod_count)
WHEN PROD_CD = 'RSALE'
THEN (SUM (prod_count) * -1)
ELSE NULL
END),0) AS SALEQTY
答案 0 :(得分:1)
NVL检查第一个参数,如果该参数为null,则将其替换为第二个参数。 所以是的,您绝对可以删除它,我完全不知道是谁干的,
也许首先是NVL,后来有人添加了case语句,并且不想弄乱当前代码。由于我认为性能上并没有真正的区别,因此即使它留下来也不会造成伤害,也确实会使它更难理解,因此可以留下来,但是没有理由留下来。
答案 1 :(得分:1)
首先,这是一个奇怪的构造。其次,相对于COALESCE()
,我更喜欢NVL()
(标准功能),但这无关紧要。
如果给定组的所有NVL()
值都可以是COALESCE()
,则需要prod_count
/ NULL
。如果是这种情况,则需要进行外部检查。仅在另一列上添加ELSE
并没有帮助。
我还将注意到逻辑看起来很可疑。通常,CASE
会作为SUM()
的参数,通常不需要进行NULL
检查:
SELECT f1,
SUM(CASE WHEN PROD_CD = 'ESALE'
THEN prod_count
WHEN PROD_CD = 'RSALE'
THEN - prod_count
ELSE 0
END) AS SALEQTY,