Sql 查询中的NVL用例

Sql 查询中的NVL用例,sql,hadoop,hive,hiveql,Sql,Hadoop,Hive,Hiveql,我们有一个在NVL语句中使用case的查询 然而,我认为NVL可以被删除 请参阅以下查询部分- select f1, NVL(( CASE WHEN PROD_CD = 'ESALE' THEN SUM (prod_count) WHEN PROD_CD = 'RSALE' THEN (SUM (prod_count) * -1) ELSE NULL

我们有一个在NVL语句中使用case的查询 然而,我认为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
我们也可以这样写来避免NVL吗

select f1, 
        CASE
            WHEN PROD_CD = 'ESALE'
            THEN SUM (prod_count)
            WHEN PROD_CD = 'RSALE'
            THEN (SUM (prod_count) * -1)
            ELSE 0
        END AS SALEQTY,

NVL检查第一个参数,如果该参数为null,则用第二个参数替换它。 所以,是的,你绝对可以移除它,我不知道是谁干的,因为这完全没有意义


也许如果NVL是第一个,有人后来添加了case语句,不想弄乱当前代码。因为我不认为在性能上真的有什么区别,如果它留下来,它不会造成伤害,也不会使它更难理解,所以它可以留下来,但没有理由留下来。

首先,这是一个奇怪的结构。其次,我更喜欢
COALESCE()
(标准函数)而不是
NVL()
——但这与此无关

如果给定组的所有
prod\u count
值都可以
NULL
,则需要
NVL()
/
COALESCE()
。如果是这样,那么您需要外部检查。仅仅在不同的列上添加一个
ELSE
,是没有帮助的

我还将注意到,逻辑看起来可疑。通常情况下,
大小写
作为
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,