你必须unnest首先使用函数(json_array_elements或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 支持相等比较,因此可以使用 COUNT DISTINCT 以及通过-> 提取,即
COUNT(DISTINCT (y.x::jsonb)->'name')