Você pode tentar um destes (em vez do endereço
jsonb_array_elements(t.addresses) address
):jsonb_array_elements(
case jsonb_typeof(addresses)
when 'array' then addresses
else '[]' end
) as address
-- or
jsonb_array_elements(
case jsonb_typeof(addresses)
when 'array' then addresses
else '[{"PostCode": null}]' end
) as address
O primeiro oculta linhas com formato json impróprio da coluna, o segundo fornece
null
para eles. No entanto, o problema realmente decorre de que um ou mais valores na coluna não são uma matriz json. Você pode corrigi-lo facilmente com o comando:
update contact
set addresses = '[null]'
-- or
-- set addresses = '[{"PostCode": null}]'
where jsonb_typeof(addresses) <> 'array' or addresses = '[]';
Após esta correção, você não precisará de
case
em jsonb_array_elements()
.