Вам нужен первичный ключ или уникальный столбец (столбцы). В примере id
уникален:
with my_table(id, col1, col2, col3) as (
values
(1, 'a', 'b', 'c'),
(2, 'a', null, null),
(3, null, 'b', 'c')
)
select id, array_agg(key) as null_columns
from my_table t
cross join jsonb_each_text(to_jsonb(t))
where value is null
group by id
id | null_columns
----+--------------
2 | {col2,col3}
3 | {col1}
(2 rows)
key
и value
- это столбцы по умолчанию, возвращаемые функцией jsonb_each_text().
См. Функции и операторы JSON в документации.