PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Interrogazione dei dati all'interno del campo dati dell'array JSON

json_array_elements(...) restituisce un set, così come il risultato dell'applicazione di ->> e = al set. Osserva:

regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)

Ti aspetteresti di essere in grado di scrivere '123' = ANY (...) ma sfortunatamente non è supportato senza un input di array. Sorprendentemente, nemmeno '123' IN (...) , qualcosa che penso dovremo sistemare.

Quindi, userei LATERAL . Ecco un modo, che restituirà un ID azienda più volte se ha più corrispondenze:

CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;

SELECT id 
FROM company c,
LATERAL json_array_elements(c.accounts) acc 
WHERE acc ->> 'account_id' = '123';