sql >> Databasteknik >  >> RDS >> PostgreSQL

hur man väljer alla poster som innehåller vissa värden från ett postgres json-fält som innehåller en array

Använd ANY till för att testa om jsonb-arrayen innehåller någon av de rätta värdena, som kan vara en array eller en underfråga, med ditt sqlfiddle-exempel

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

Du kan också skicka en array-literal, i det här fallet skulle det kräva en array med JSONB-värden, det vill säga den högra sidan av @> kan ersättas med bokstaven ANY('{123,456}'::JSONB[])

Alternativt, använd && för att testa för arrayöverlappning. Det är först nödvändigt att konvertera JSON/JSONB-arrayen till en inbyggd 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 också ersätta arrayliteralen '{123, 456}' med en underfråga som returnerar en matris med heltal, till exempel (SELECT ARRAY_AGG(data_id) FROM tableB)

Ett annat alternativ skulle vara att använda eller i din where-klausul

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



  1. Vad är skillnaden mellan Is Not Null och Not Is Null

  2. Lagrad procedur SQL-exekveringsplan

  3. MySQL LOG2() Funktion – Returnerar bas-2-logaritmen för ett värde

  4. json_encode för mysql-frågan returnerar några nollkolumner i vissa rader, men kolumnerna är inte null