Anda harus menghancurkan array objek json terlebih dahulu menggunakan fungsi (json_array_elements
atau jsonb_array_elements
jika Anda memiliki tipe data jsonb ), maka Anda dapat mengakses nilai dengan menentukan kuncinya.
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"
Untuk mendapatkan hitungan nama unik, ini adalah kueri yang mirip dengan yang di atas, kecuali fungsi agregat hitungan yang berbeda diterapkan ke 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
Hal ini diperlukan untuk menggunakan ->>
bukannya ->
seperti sebelumnya (->>
) menampilkan nilai yang diekstraksi sebagai teks, yang mendukung perbandingan kesetaraan (diperlukan untuk penghitungan yang berbeda), sedangkan yang terakhir (->
) mengekstrak nilai sebagai json, yang tidak mendukung perbandingan kesetaraan.
Atau, konversikan json
sebagai jsonb
dan gunakan jsonb_array_elements
. JSONB
mendukung perbandingan kesetaraan, sehingga dimungkinkan untuk menggunakan COUNT DISTINCT bersama dengan ekstraksi melalui ->
, yaitu
COUNT(DISTINCT (y.x::jsonb)->'name')