sql >> Database teknologi >  >> RDS >> PostgreSQL

hvordan man vælger alle poster, der indeholder bestemte værdier, fra et postgres json-felt, der indeholder et array

Brug ANY til for at teste om jsonb-arrayet indeholder nogen af de rigtige værdier, som kan være et array eller en underforespørgsel, ved hjælp af dit sqlfiddle-eksempel

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

Du kan også sende en array literal, i dette tilfælde ville det kræve en matrix af JSONB-værdier, dvs. højre side af @> kunne erstattes med bogstavet ANY('{123,456}'::JSONB[])

Alternativt kan du bruge && for at teste for matrixoverlapning. Det er først nødvendigt at konvertere JSON/JSONB-arrayet til et 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}'

Du kan også erstatte array-literalen '{123, 456}' med en underforespørgsel, der returnerer en matrix af heltal, såsom (SELECT ARRAY_AGG(data_id) FROM tableB)

En anden mulighed ville være at bruge eller i din where-klausul

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



  1. LDAP:Tom binddn og godkendelsestype bliver enkel fra ingen

  2. Dato til millisekunder / millisekunder til dato

  3. sql primær nøgle og indeks

  4. Hvordan rundes ned til nærmeste heltal i MySQL?