あなたはunestする必要があります 最初に関数(json_array_elements
を使用するjsonオブジェクトの配列 またはjsonb_array_elements
jsonbデータ型がある場合 )、キーを指定することで値にアクセスできます。
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"
一意の名前のカウントを取得するには、上記と同様のクエリですが、個別の集計関数のカウントが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
->>
を使用する必要があります ->
の代わりに 前者として(->>
)抽出された値をテキストとしてキャストします。これは、同等性の比較(個別のカウントに必要)をサポートしますが、後者(->
)値をjsonとして抽出します。これは、同等性の比較をサポートしていません。
または、json
を変換します jsonb
として jsonb_array_elements
を使用します 。 JSONB
等式比較をサポートしているため、->
を介した抽出とともにCOUNTDISTINCTを使用できます。 、つまり
COUNT(DISTINCT (y.x::jsonb)->'name')