musíte rozpojit pole json-objects nejprve pomocí funkce (json_array_elements
nebo jsonb_array_elements
pokud máte datový typ jsonb ), pak můžete k hodnotám přistupovat zadáním klíče.
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"
Chcete-li získat počet jedinečných názvů, jedná se o podobný dotaz jako výše, s tím rozdílem, že na y.x->>name
je použita agregační funkce typu count.
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
Je nutné použít ->>
místo ->
jako první (->>
) přenese extrahovanou hodnotu jako text, který podporuje porovnání rovnosti (potřebné pro odlišný počet), zatímco druhé (->
) extrahuje hodnotu jako json, což nepodporuje porovnání rovnosti.
Případně převeďte json
jako jsonb
a použijte jsonb_array_elements
. JSONB
podporuje porovnání rovnosti, takže je možné použít COUNT DISTINCT spolu s extrakcí přes ->
, tj.
COUNT(DISTINCT (y.x::jsonb)->'name')