处理的黑斑羚
问题描述:
空数据我想了解处理的黑斑羚
我使用下表
╔════╦══════════════╦══════════╗
║ id ║ name ║ salary ║
╠════╬══════════════╬══════════╣
║ 1 ║ cde ║ 5636 ║
║ 2 ║ asd ║ 148 ║
║ 3 ║ pwe ║ null ║
║ 4 ║ lmn ║ 959 ║
╚════╩══════════════╩══════════╝
当我执行以下查询
在因帕拉算术运算的行为
select salary+20 as sum1 from table where id=3;
它返回我
|sum1
---|-----
1 |NULL
当我运行在列总和与
select sum(salary) as sum1 from table;
|sum1
---|-----
1 |6743
我无法了解相同的算术运算表现不同
答
你有没有尝试过这样的:
select sum(COALESCE(salary,0)) as sum1 from table;
这应该确保返回的值是一个数字。类似于leftjoin的答案。你也可以用case语句或where语句来做到这一点。
来源:
https://www.cloudera.com/documentation/enterprise/5-4-x/topics/impala_conditional_functions.html
答
这些都是不同的算术查询。
在第一个查询你想要的DB从第3行3井行的salary
是NULL
返回salary+20
。所以DB将看到NULL+20=NULL
并返回NULL
。
但在第二个查询中:sum(salary) from table;
要求数据库对整个salary
列进行求和并将其返回给您。所以它看起来并且不会5636+148+959=6743
(忽略NULL
)。
总结在第一个查询中,您正在执行一个基本的算术运算符。但第二个查询sum()
是应用于返回行的运算符。作为一个更好的测试,尝试运行select sum(salary) as sum1 from table where id=3
,看看你能更好地理解正在发生的事情。
答
NULL不是零(0),零不是NULL,它是一个值,这是最重要的。 NULL是没有值的,什么也没有。 sum()
仅限聚合值。如果数据集中没有任何值,则返回NULL。如果它是一些值,sum()会聚合它们,忽略空值。如果你想NULL
其转换为零,使用NVL()
功能:
select nvl(sum(salary),0) as sum1 from table where ...
这个查询将返回的情况下0有数据集中没有值。
按照你的理论,当我这样做从表总和(工资),其中id = 3应该忽略空并打印总和为zero.But还是它返回NULL – sri
啊我看你可能会感到困惑。因此,在sum()中,如果数据库中有有效值,它将返回这些有效值的总和。但是,如果你试图总结无效的值,即。 'a + null + 1.144es'或者它会抱怨并返回'null'。但是'10 + null + 20 + a'会返回'30'。 – Francisco
10 + null + 20 + a也返回NULL – sri