Еще один подход, чтобы сделать код короче, использовать КАЖДУЮ агрегатную функцию
create table x
(
y serial,
z int[]
);
insert into x(z) values(array[null,null,null]::int[])
insert into x(z) values(array[null,7,null]::int[])
insert into x(z) values(array[null,3,4]::int[])
insert into x(z) values(array[null,null,null,null]::int[])
with a as
(
select y, unnest(z) as b
from x
)
select y, every(b is null)
from a
group by y
order by y
Выход:
y | every
---+-------
1 | t
2 | f
3 | f
4 | t
(4 rows)
Другой подход, генерирующий значения NULL для сравнения:
select y,
z =
(select array_agg(null::int)
from generate_series(1, array_upper(z, 1) )) as IsAllNulls
from x
В основе логики кода выше, это возвращает истину:
SELECT ARRAY[NULL,NULL]::int[] = ARRAY[NULL,NULL]::int[]
Другой подход, используйте array_fill
select y, z = array_fill(null::int, array[ array_upper(z, 1) ] )
from x
Caveat, конструкция массива и array_fill не являются симметричными, проверьте их:
select array[5]
-- array[5] here has different meaning from array[5] above
select array_fill(null::int, array[5])