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)
trongORDER 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. TrongSELECT
danh sách,NULLIF
thay thế tên phù hợp bằngNULL
, đạt được kết quả tương tự như trên.
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:
- Làm cách nào để chuyển mảng json thành mảng postgres?
- PostgreSQL unnest () với số phần tử
- Lập chỉ mục để tìm một phần tử trong mảng JSON
- Mức độ ưu tiên dựa trên thời gian trong Truy vấn Bản ghi Hoạt động
- Chọn trước hàng trong mỗi GROUP BY nhóm?