sql >> Databáze >  >> RDS >> PostgreSQL

jak vybrat všechny záznamy obsahující určité hodnoty z pole postgres json obsahujícího pole

Použijte ANY až k otestování, zda pole jsonb obsahuje nějaké správných hodnot, což může být pole nebo poddotaz, použijte svůj příklad sqlfiddle

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

Můžete také předat literál pole, v tomto případě by to vyžadovalo pole hodnot JSONB, tj. pravá strana @> lze nahradit doslovným ANY('{123,456}'::JSONB[])

Případně použijte && otestovat překrytí pole. Nejprve je nutné převést pole JSON/JSONB na nativní pole

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

Můžete také nahradit literál pole '{123, 456}' s poddotazem, který vrací pole celých čísel, například (SELECT ARRAY_AGG(data_id) FROM tableB)

Další možností by bylo použít nebo ve vaší klauzuli where

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



  1. Změna typu sloupu na delší řetězce v kolejnicích

  2. Stále dostávám tento chybový kód mysql #1089

  3. T-SQL - Aliasing pomocí =versus as

  4. Zobrazení dat z databáze pomocí základního adaptéru a zobrazení seznamu