NVL用例查询

时间:2019-04-11 07:26:13

标签: sql hadoop hive hiveql

我们有一个在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

2 个答案:

答案 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,