PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

cách chọn tất cả các bản ghi có chứa các giá trị nhất định từ một trường postgres json chứa một mảng

Sử dụng ANY để kiểm tra xem mảng jsonb có chứa bất kỳ các giá trị phù hợp, có thể là một mảng hoặc một truy vấn con, sử dụng ví dụ sqlfiddle của bạn

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

Bạn cũng có thể chuyển một ký tự mảng, trong trường hợp này, nó sẽ yêu cầu một mảng các giá trị JSONB, tức là phía bên phải của @> có thể được thay thế bằng chữ ANY('{123,456}'::JSONB[])

Ngoài ra, hãy sử dụng && để kiểm tra sự chồng chéo của mảng. Đầu tiên cần phải chuyển đổi mảng JSON / JSONB thành mảng gốc

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

Bạn cũng có thể thay thế mảng chữ '{123, 456}' với truy vấn con trả về một mảng số nguyên, chẳng hạn như (SELECT ARRAY_AGG(data_id) FROM tableB)

Một tùy chọn khác sẽ là sử dụng hoặc trong mệnh đề where của bạn

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. Thay đổi nhóm bảo mật trên Phiên bản cơ sở dữ liệu AWS RDS

  2. Lấy kích thước của lobject trong PostgreSQL

  3. Nhập các tệp XML vào PostgreSQL

  4. Làm cách nào để CHỌN dữ liệu từ bảng con trong PostgreSQL?

  5. Tại sao Postgres nói rằng cột không tồn tại?