我正在做一堆求和查询:
SELECT col1 + col2 + col3 + ...
某些列中的某些值是null。我通过以下操作检查它们:
null
SELECT CASE WHEN col1 is not null and col2 is not null and ...
我想知道是否有更简洁的语法来完成这项任务。
r6hnlfcb1#
好吧,因为任何数字和null的和都是null,你可以做如下的事情(明显的...填充):
...
select big_honking_sum from( select col1+col2+col3+...+coln as big_honking_sum from some_table )sum where big_honking_sum is not null;
2wnc66cl2#
如果可以接受NULL值将被视为0,则使用COALESCE函数。
SELECT COALESCE(Col1,0) + COALESCE(Col2,0) + COALESCE(Col3,0) AS TOTAL FROM table;
也许你可以考虑使用0作为默认值,而不是NULL(如果适用)。
uqcuzwp83#
更简单、更快、更清晰:
... WHERE (col1, col2, col3) IS NOT NULL;
当(且仅当)ROW表达式中的所有字段都是NOT NULL时,表达式返回true。请参见:
NOT NULL
true
也可以应用于整行:
SELECT ... FROM my_table t WHERE (t.*) IS NOT NULL;
Postgres甚至有一个专门的功能:num_nulls()。在Postgres 15上的测试中稍微昂贵一些,但更清晰:
num_nulls()
... WHERE num_nulls(col1, col2, col3) = 0;
fiddle
3条答案
按热度按时间r6hnlfcb1#
好吧,因为任何数字和
null
的和都是null
,你可以做如下的事情(明显的...
填充):2wnc66cl2#
如果可以接受NULL值将被视为0,则使用COALESCE函数。
也许你可以考虑使用0作为默认值,而不是NULL(如果适用)。
uqcuzwp83#
更简单、更快、更清晰:
当(且仅当)ROW表达式中的所有字段都是
NOT NULL
时,表达式返回true
。请参见:也可以应用于整行:
Postgres甚至有一个专门的功能:
num_nulls()
。在Postgres 15上的测试中稍微昂贵一些,但更清晰:fiddle