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

Consultando dados no campo de dados da matriz JSON


json_array_elements(...) retorna um conjunto, assim como o resultado da aplicação de ->> e = ao conjunto. Observar:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)

Você esperaria apenas poder escrever '123' = ANY (...) mas isso não é suportado sem uma entrada de matriz, infelizmente. Surpreendentemente, nem '123' IN (...) , algo que acho que vamos ter que corrigir.

Então, eu usaria LATERAL . Aqui está uma maneira, que retornará um ID de empresa várias vezes se tiver várias correspondências:
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';