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

Cần chọn động một phần tử mảng JSON từ bảng postgresql

json trong Postgres 9.3

Điều này khó trong trang 9.3 vì thiếu chức năng hữu ích.

Phương pháp 1

Unnest in a LEFT JOIN LATERAL (rõ ràng và phù hợp với tiêu chuẩn), cắt dấu ngoặc kép từ json sau khi truyền sang text . Xem các liên kết bên dưới.

SELECT DISTINCT ON (1)
       t.id, t.name, d.last
FROM   tbl t
LEFT   JOIN LATERAL (
  SELECT ('[' || d::text || ']')::json->>0 AS last
  FROM   json_array_elements(t.data) d
  ) d ON d.last <> t.name
ORDER  BY 1, row_number() OVER () DESC;

Trong khi điều này hoạt động, và tôi chưa bao giờ thấy nó thất bại, thứ tự của các phần tử không được yêu cầu phụ thuộc vào hành vi không có giấy tờ. Xem các liên kết bên dưới!
Cải thiện chuyển đổi từ json thành text với biểu thức được cung cấp bởi @pozs trong nhận xét . Vẫn hackish, nhưng phải an toàn.

Phương pháp 2

SELECT DISTINCT ON (1)
       id, name, NULLIF(last, name) AS last
FROM (
   SELECT t.id, t.name
        ,('[' || json_array_elements(t.data)::text || ']')::json->>0 AS last
        , row_number() OVER () AS rn
   FROM   tbl t
   ) sub
ORDER  BY 1, (last = name), rn DESC;
  • Unnest in the SELECT danh sách (không chuẩn).
  • Đính kèm số hàng (rn ) song song (đáng tin cậy hơn).
  • Chuyển đổi thành text như trên.
  • Biểu thức (last = name) trong ORDER BY mệnh đề sắp xếp các tên phù hợp với họ (nhưng trước NULL). Vì vậy, một tên phù hợp chỉ được chọn nếu không có tên nào khác. Liên kết cuối cùng bên dưới. Trong SELECT danh sách, NULLIF thay thế tên phù hợp bằng NULL , đạt được kết quả tương tự như trên.

SQL Fiddle.

json hoặc jsonb trong Postgres 9.4

pg 9.4 cung cấp tất cả các cải tiến cần thiết:

SELECT DISTINCT ON (1)
       t.id, t.name, d.last
FROM   tbl t
LEFT   JOIN LATERAL json_array_elements_text(data) WITH ORDINALITY d(last, rn)
       ON d.last <> t.name
ORDER  BY d.rn DESC;

Sử dụng jsonb_array_elements_text() cho jsonb . Tất cả những thứ khác đều giống nhau.

hàm json / jsonb trong sách hướng dẫn

Các câu trả lời liên quan có giải thích thêm:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernate postgres bytea truy xuất vấn đề

  2. Rails 3, Heroku:Taps Server Error:PGError:ERROR:chuỗi byte không hợp lệ để mã hóa UTF8:0xba

  3. Cách so sánh hai bảng trong postgres

  4. Liên kết tham số mảng với truy vấn gốc

  5. Làm cách nào để cải thiện hiệu suất truy vấn dựa trên ngày trên một bảng lớn?