sql >> Database >  >> RDS >> PostgreSQL

hoe alle records met bepaalde waarden te selecteren uit een postgres json-veld dat een array bevat

Gebruik ANY to om te testen of de jsonb-array elke . bevat van de juiste waarden, die een array of een subquery kunnen zijn, met behulp van uw sqlfiddle-voorbeeld

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

U kunt ook een letterlijke array doorgeven, in dit geval is een reeks JSONB-waarden vereist, d.w.z. de rechterkant van @> kan worden vervangen door de letterlijke ANY('{123,456}'::JSONB[])

Of gebruik de && om te testen op array-overlap. Het is eerst nodig om de JSON/JSONB-array te converteren naar een native array

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

U kunt ook de letterlijke array '{123, 456}' . vervangen met een subquery die een array van gehele getallen retourneert, zoals (SELECT ARRAY_AGG(data_id) FROM tableB)

Een andere optie zou zijn om of in uw waar-clausule te gebruiken

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



  1. Hoe maak ik een back-up van mijn PostgreSQL-database met Cron?

  2. Converteer 'datetimeoffset' naar 'smalldatetime' in SQL Server (T-SQL-voorbeelden)

  3. Is het goed om htmlspecialchars() te gebruiken voor het invoegen in MySQL?

  4. Waarom produceert fputcsv dubbele kolommen?