PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

não pode extrair elementos de um escalar


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() .