sql >> Base de Datos >  >> RDS >> PostgreSQL

no se pueden extraer elementos de un escalar

Puede probar uno de estos (en lugar de 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

El primero oculta filas con formato json incorrecto de la columna, el segundo da null para ellos.

Sin embargo, el problema en realidad se debe a que uno o más valores en la columna no son una matriz json. Puedes arreglarlo fácilmente con el comando:

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

Después de esta corrección, no necesitarás case en jsonb_array_elements() .