PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfragen von Daten innerhalb des JSON-Array-Datenfelds

json_array_elements(...) gibt einen Satz zurück, ebenso wie das Ergebnis der Anwendung von ->> und = zum Satz. Beachten Sie:

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

Sie würden erwarten, nur '123' = ANY (...) schreiben zu können aber ohne Array-Eingabe wird das leider nicht unterstützt. Überraschenderweise ist '123' IN (...) auch nicht , etwas, von dem ich denke, dass wir es beheben müssen.

Also würde ich LATERAL verwenden . Hier ist eine Möglichkeit, die eine Unternehmens-ID mehrmals zurückgibt, wenn sie mehrere Übereinstimmungen hat:

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