在学习Hive过程中遇到了一个问题:如果查询语句中的表达式包含空值,会导致最终表达式结果为空值。
举一个例子,假设有一个员工表emp
name | sal | comm |
---|---|---|
Jack | 1000 | 200 |
Tony | 1200 | 300 |
Tom | 1300 | NULL |
Rose | 900 | 100 |
Lily | 800 | 500 |
Tim | 1100 | NULL |
表中第一列是姓名,第二列是月薪,第三列是奖金
现在想获得年薪和年收入,其中:
年薪 = sal * 12
年收入 = sal * 12 + comm
select name, sal * 12, sal * 12 + comm
from emp;
查询结果:
name | sal * 12 | sal * 12 + comm |
---|---|---|
Jack | 12000 | 12200 |
Tony | 14400 | 14700 |
Tom | 15600 | NULL |
Rose | 10800 | 10900 |
Lily | 9600 | 10100 |
Tim | 13200 | NULL |
可以看到涉及到空值的表达式无法正常表示
经过查找发现了一个解决方法:nvl函数
nvl函数: 空值转换函数
函数形式: nvl(expr1,expr2)
作用: 将查询为Null值转换为指定值
注意:
- 若expr1为Null,则返回expr2,否则返回expr1
- 适用于数字型、字符型和日期型,但是expr1和expr2的数据类型必须为相同类型
select name, sal * 12, sal * 12 + nvl(comm, 0)
from emp;
查询结果:
name | sal * 12 | sal * 12 + comm |
---|---|---|
Jack | 12000 | 12200 |
Tony | 14400 | 14700 |
Tom | 15600 | 15600 |
Rose | 10800 | 10900 |
Lily | 9600 | 10100 |
Tim | 13200 | 13200 |