json_array_elements(...)
returnerar en uppsättning, och det gör också resultatet av att tillämpa ->>
och =
till uppsättningen. Observera:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Du förväntar dig att bara kunna skriva '123' = ANY (...)
men det stöds inte utan en arrayingång, tyvärr. Överraskande nog är inte '123' IN (...)
heller , något jag tror att vi måste fixa.
Så jag skulle använda LATERAL
. Här är ett sätt som returnerar ett företags-ID flera gånger om det har flera matchningar:
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';