PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

как да изберете всички записи, съдържащи определени стойности от поле на postgres json, съдържащо масив

Използвайте ANY до, за да проверите дали масивът jsonb съдържа всеки на правилните стойности, които могат да бъдат масив или подзаявка, използвайки вашия пример за sqlfiddle

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

Можете също така да подадете литерал на масив, в този случай това ще изисква масив от JSONB стойности, т.е. дясната страна на @> може да се замени с литерала ANY('{123,456}'::JSONB[])

Като алтернатива използвайте && за тестване за припокриване на масиви. Първо е необходимо да преобразувате JSON/JSONB масива в естествен масив

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

Можете също да замените литерала на масива '{123, 456}' с подзаявка, която връща масив от цели числа, като (SELECT ARRAY_AGG(data_id) FROM tableB)

Друг вариант би бил да използвате или във вашата клауза where

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Огледални специфични таблици в postgreSQL

  2. Грешка:трябва да е собственик на база данни

  3. PostgreSQL:Разширяване на честотната таблица

  4. списък тип Postgres ENUM

  5. Актуализирането на цяла колона от jsonb член е неуспешно с:колоната е от тип integer, но изразът е от тип jsonb