json_array_elements(...)
returnerer et sæt, og det samme gør resultatet af at anvende ->> og
=
til sættet. Bemærk:
regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
?column?
----------
t
f
(2 rows)
Du ville forvente bare at kunne skrive '123' =ENHVER (...)
men det understøttes ikke uden et array-input, desværre. Overraskende nok er '123' IN (...)
heller ikke , noget jeg tror, vi bliver nødt til at ordne.
Så jeg ville bruge LATERAL
. Her er en måde, som returnerer et virksomheds-id flere gange, hvis det har flere matches:
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';