musisz rozpakować tablica obiektów json najpierw przy użyciu funkcji (json_array_elements
lub jsonb_array_elements
jeśli masz typ danych jsonb ), możesz uzyskać dostęp do wartości, określając klucz.
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"
Aby uzyskać liczbę unikalnych nazw, jest to podobne zapytanie do powyższego, z wyjątkiem funkcji agregującej liczbę odrębnych nazw jest stosowana do y.x->>nazwa
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
Konieczne jest użycie ->>
zamiast ->
jako poprzedni (->> ) rzutuje wyodrębnioną wartość jako tekst, który obsługuje porównanie równości (wymagane do odrębnej liczby), podczas gdy ta druga (
->
) wyodrębnia wartość jako json, która nie obsługuje porównania równości.
Alternatywnie przekonwertuj json
jako jsonb
i użyj jsonb_array_elements
. JSONB
obsługuje porównywanie równości, dzięki czemu możliwe jest użycie COUNT DISTINCT wraz z ekstrakcją poprzez ->
, czyli
COUNT(DISTINCT (y.x::jsonb)->'name')