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

Truy vấn dữ liệu trong trường dữ liệu mảng JSON

json_array_elements(...) trả về một tập hợp và kết quả của việc áp dụng ->> cũng vậy và = đến bộ. Quan sát:

regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)

Bạn mong đợi chỉ có thể viết '123' = ANY (...) nhưng điều đó không được hỗ trợ nếu không có đầu vào mảng, thật không may. Đáng ngạc nhiên là '123' IN (...) cũng không , điều mà tôi nghĩ chúng ta sẽ phải sửa.

Vì vậy, tôi sẽ sử dụng LATERAL . Đây là một cách, sẽ trả về một ID công ty nhiều lần nếu nó có nhiều kết quả trùng khớp:

CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;

SELECT id 
FROM company c,
LATERAL json_array_elements(c.accounts) acc 
WHERE acc ->> 'account_id' = '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. Giảm cột trong Postgres trên một tập dữ liệu lớn

  2. Bắt đầu với Postgres 13 trên Ubuntu 20.04

  3. Bảng có tọa độ của lưới lục giác bao phủ thế giới

  4. Lấy tên tháng từ số trong PostgreSQL

  5. Nâng cấp cơ sở dữ liệu của bạn lên phiên bản PostgreSQL 10 - Những điều bạn nên biết