Вот что я придумал:
CREATE OR REPLACE FUNCTION any_is_null(col TEXT, tab TEXT, OUT tmp BOOL) RETURNS boolean
AS $$
BEGIN
EXECUTE format('SELECT
true
from %s
WHERE %s IS NULL LIMIT 1
', tab, col) into tmp;
END;
$$ LANGUAGE plpgsql;
select c.table_schema,
c.table_name,
c.column_name,
case c.is_nullable
when 'NO' then 'false'
when 'YES' then 'true'
end as nullable,
CASE
WHEN any_is_null(c.column_name, c.table_name) IS NULL
AND c.is_nullable = 'YES'
THEN true
ELSE FALSE
END as could_be_non_nullable
from information_schema.columns c
join information_schema.tables t
on c.table_schema = t.table_schema
and c.table_name = t.table_name
where c.table_schema in ('public')
and t.table_type = 'BASE TABLE'
order by table_schema,
table_name,
column_name;
Замените where c.table_schema in ('public')
схемами, на которых вы хотите сфокусироваться.
Не забудьте опуститьфункция после того, как вы закончите.
PS: Это, вероятно, максимально увеличит вашу базу данных, если у вас много столбцов без значений NULL, так как каждый столбец будет полностью отсканирован в таблице), так что будьте осторожны!