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