Sql 查询中的NVL用例
我们有一个在NVL语句中使用case的查询 然而,我认为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
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,