在一行中查找空列的总和

时间:2019-12-06 11:13:52

标签: sql postgresql

我想创建一列,以查找postgres表中非空列的数量(如下所示)。你能给我个头还是解决的办法?

enter image description here

3 个答案:

答案 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);

链接:https://www.db-fiddle.com/f/fU5LLuh5gvwkKhhRbeCyh8/0

答案 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答案中的布尔表达式将更快。

Online example

答案 2 :(得分:2)

在Postgres中,我会简单地做:

select t.*,
       ((a is not null)::int + (b is not null)::int + (c is not null)::int) as cnt
from t;