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

Consulta de datos dentro del campo de datos de matriz JSON

json_array_elements(...) devuelve un conjunto, al igual que el resultado de aplicar ->> y = al conjunto. Observa:

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

Esperarías poder escribir '123' = ANY (...) pero eso no es compatible sin una entrada de matriz, desafortunadamente. Sorprendentemente, tampoco '123' IN (...) , algo que creo que tendremos que arreglar.

Entonces, usaría LATERAL . Aquí hay una forma, que devolverá una ID de empresa varias veces si tiene varias coincidencias:

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';