трябва да отстраните масивът от json-обекти първо използвайки функцията (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')