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