答案 0 :(得分:4)
您可以始终将GENERATED用作列。示例:
create table test (a VARCHAR (50),
b VARCHAR (50),
c VARCHAR (50),
cnt numeric GENERATED always as (
case when a is null then 0 else 1 end +
case when b is null then 0 else 1 end +
case when c is null then 0 else 1 end
) STORED);
答案 1 :(得分:2)
如果您不想对列名进行硬编码,则可以为此使用一些JSON魔术:
select a,b,c,
(select count(*) from jsonb_object_keys(jsonb_strip_nulls(to_jsonb(t)))) as num_not_null
from the_table t
jsonb_strip_nulls(to_jsonb(t))
将整行转换为单个json值,其中列名是键。任何空值将被删除。然后,使用jsonb_object_keys
提取键,并且返回的键数是该行中非空列的数量。
如果您不介意显式列出所有列名,则使用EragonBY答案中所示的CASE表达式或Gordon答案中的布尔表达式将更快。
答案 2 :(得分:2)
在Postgres中,我会简单地做:
select t.*,
((a is not null)::int + (b is not null)::int + (c is not null)::int) as cnt
from t;