PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

impossible d'extraire des éléments d'un scalaire

Vous pouvez essayer l'une d'entre elles (au lieu de l'adresse 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

Le premier masque les lignes avec un format json incorrect de la colonne, le second donne null pour eux.

Cependant, le problème vient en fait du fait qu'une ou plusieurs valeurs de la colonne ne sont pas un tableau json. Vous pouvez facilement le réparer avec la commande :

update contact
set addresses = '[null]' 
-- or
-- set addresses = '[{"PostCode": null}]'
where jsonb_typeof(addresses) <> 'array' or addresses = '[]';

Après cette correction, vous n'aurez plus besoin de case dans jsonb_array_elements() .