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

So wählen Sie alle Datensätze aus, die bestimmte Werte aus einem Postgres-JSON-Feld enthalten, das ein Array enthält

Verwenden Sie ANY to, um zu testen, ob das jsonb-Array beliebige enthält der richtigen Werte, die ein Array oder eine Unterabfrage sein können, unter Verwendung Ihres sqlfiddle-Beispiels

SELECT *
FROM tableA
WHERE (data->'sequence') @> ANY(SELECT (data_id::TEXT)::JSONB FROM tableB)

Sie können auch ein Array-Literal übergeben, in diesem Fall wäre ein Array von JSONB-Werten erforderlich, d. h. die rechte Seite von @> könnte durch das Literal ANY('{123,456}'::JSONB[]) ersetzt werden

Verwenden Sie alternativ den && um auf Array-Überlappung zu testen. Zuerst muss das JSON/JSONB-Array in ein natives Array konvertiert werden

SELECT tableA.*
FROM tableA 
JOIN LATERAL (
  SELECT ARRAY_AGG(v::INT) y 
  FROM JSONB_ARRAY_ELEMENTS_TEXT(data->'sequence') v
) x ON TRUE
WHERE x.y && '{123, 456}'

Sie können auch das Array-Literal '{123, 456}' ersetzen mit einer Unterabfrage, die ein Array von Ganzzahlen zurückgibt, wie z. B. (SELECT ARRAY_AGG(data_id) FROM tableB)

Eine andere Option wäre die Verwendung von oder in Ihrer where-Klausel

select *
from tableA 
where (data->'sequence') @> '[456]'
   or (data->'sequence') @> '[123]'