处理 impala 中的 NULL 数据
Handling the NULL data in impala
我正在尝试了解 impala
中算术运算的行为
我正在使用以下 table
╔════╦══════════════╦══════════╗
║ 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;
它returns我
|sum1
---|-----
1 |NULL
当我 运行 对
的列求和时
select sum(salary) as sum1 from table;
|sum1
---|-----
1 |6743
我无法理解相同的算术运算有何不同
这些是不同的算术查询。
在您的第一个查询中,您希望数据库从第 3 行 return salary+20
。第 3 行的 salary
是 NULL
。所以数据库会看到 NULL+20=NULL
和 return NULL
。
但是在第二个查询中:sum(salary) from table;
要求数据库对整个 salary
列求和,然后 return 将其提供给您。所以它查看它并执行 5636+148+959=6743
(忽略 NULL
)。
总之,在第一个查询中,您正在执行一个基本的算术运算符。但是第二个查询 sum()
是一个应用于 returned 行的运算符。作为更好的测试,请尝试 运行 select sum(salary) as sum1 from table where id=3
并查看您得到的结果以更好地了解正在发生的事情。
NULL 不是零 (0),零也不是 NULL,它是一个值,这是最重要的。 NULL 是没有值,什么都没有。 sum()
仅聚合值。如果它在数据集中没有任何值,那么它 returns NULL。如果它是一些值, sum() 将聚合它们,忽略空值。如果要将 NULL
转换为零,请使用 NVL()
函数:
select nvl(sum(salary),0) as sum1 from table where ...
如果数据集中没有值,此查询将 return 0。
你有没有尝试过类似的东西:
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
我正在尝试了解 impala
中算术运算的行为我正在使用以下 table
╔════╦══════════════╦══════════╗
║ 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;
它returns我
|sum1
---|-----
1 |NULL
当我 运行 对
的列求和时select sum(salary) as sum1 from table;
|sum1
---|-----
1 |6743
我无法理解相同的算术运算有何不同
这些是不同的算术查询。
在您的第一个查询中,您希望数据库从第 3 行 return salary+20
。第 3 行的 salary
是 NULL
。所以数据库会看到 NULL+20=NULL
和 return NULL
。
但是在第二个查询中:sum(salary) from table;
要求数据库对整个 salary
列求和,然后 return 将其提供给您。所以它查看它并执行 5636+148+959=6743
(忽略 NULL
)。
总之,在第一个查询中,您正在执行一个基本的算术运算符。但是第二个查询 sum()
是一个应用于 returned 行的运算符。作为更好的测试,请尝试 运行 select sum(salary) as sum1 from table where id=3
并查看您得到的结果以更好地了解正在发生的事情。
NULL 不是零 (0),零也不是 NULL,它是一个值,这是最重要的。 NULL 是没有值,什么都没有。 sum()
仅聚合值。如果它在数据集中没有任何值,那么它 returns NULL。如果它是一些值, sum() 将聚合它们,忽略空值。如果要将 NULL
转换为零,请使用 NVL()
函数:
select nvl(sum(salary),0) as sum1 from table where ...
如果数据集中没有值,此查询将 return 0。
你有没有尝试过类似的东西:
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