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

Truy vấn một mảng JSON của các đối tượng trong Postgres

bạn phải không trung thực mảng các đối tượng json đầu tiên sử dụng hàm (json_array_elements hoặc jsonb_array_elements nếu bạn có kiểu dữ liệu jsonb ), sau đó bạn có thể truy cập các giá trị bằng cách chỉ định khóa.

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  y.x->'name' "name"
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

-- outputs:
name
--------------
"Mickey Mouse"
"Donald Duck"

Để có được số lượng các tên duy nhất, truy vấn của nó tương tự như ở trên, ngoại trừ hàm tổng hợp riêng biệt được áp dụng cho y.x->>name

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  COUNT( DISTINCT y.x->>'name') distinct_names
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

Nó là cần thiết để sử dụng ->> thay vì -> như cũ (->> ) chuyển giá trị được trích xuất dưới dạng văn bản, hỗ trợ so sánh bình đẳng (cần thiết cho số lượng riêng biệt), trong khi giá trị sau (-> ) trích xuất giá trị dưới dạng json, không hỗ trợ so sánh bình đẳng.

Ngoài ra, hãy chuyển đổi json dưới dạng jsonb và sử dụng jsonb_array_elements . JSONB hỗ trợ so sánh bình đẳng, do đó có thể sử dụng COUNT DISTINCT cùng với trích xuất qua -> , tức là

COUNT(DISTINCT (y.x::jsonb)->'name')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các Tuyên bố Chuẩn bị Đã Tồn tại

  2. Làm sắc nét dữ liệu của bạn với PostgreSQL 11

  3. Cách tốt nhất để lưu trữ thời gian trên 24:00:00 trong postgresql?

  4. Chọn các ký tự lạ trên văn bản, không hoạt động với toán tử LIKE

  5. Postgres UPDATE to_tsvector cập nhật tất cả các hàng thành cùng một giá trị