@@ -15,6 +15,8 @@ AS $func$
1515 with recursive r (path , value, member_of) as
1616 (
1717 select
18+ -- distinct --[42883] ERROR: could not identify an equality operator for type json
19+ distinct on (array[k .key ], v .value ::text , t .type ) -- !!! fix performance problem
1820 array[k .key ],
1921 v .value ,
2022 t .type
@@ -47,15 +49,31 @@ $func$;
4749comment on function public.json_unnest_recursive(data json) is ' Recursive parse nested JSON (arrays and objects), returns keys and its values' ;
4850
4951
52+ -- ----------------------------------------------------------------------------------------------------------------------
53+ -- TEST
54+
5055-- TEST AND USING EXAMPLE
5156select cardinality(path ) as level, *
5257from public .json_unnest_recursive (' {"id":123,"g":null,"a":[9,8,4,5],"name":"unknown", "7": 3}' ::json)
5358order by level, member_of, path ;
5459
60+
5561/*
5662-- Example: find all emails in JSON data
57- select path, value #>> '{}' as email
58- from public.json_unnest_recursive('[{"name":"Mike", "age": 45, "emails":[null, "mike.1977@gmail.com"]}]'::json)
59- where json_typeof(value) = 'string'
60- and public.is_email(value #>> '{}');
63+ select j.path, v.value as email
64+ from public.json_unnest_recursive('[{"name":"Mike", "age": 45, "emails":[null, "mike.1977@gmail.com", ""]}]'::json) as j
65+ cross join nullif(j.value #>> '{}', '') as v(value) --cast jsonb scalar to text (can be null)
66+ where json_typeof(j.value) = 'string'
67+ and v.value is not null
68+ and public.is_email(v.value);
6169*/
70+
71+ do $$
72+ begin
73+ assert (select count (* ) = 8
74+ from public .json_unnest_recursive (
75+ ' {"id":123,"g":null,"a":[9,8,4,5],"name":"unknown", "7": 3}' ::json
76+ )
77+ );
78+ end;
79+ $$;
0 commit comments