@@ -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}' 
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}' 
76+  )
77+  );
78+ end;
79+ $$;
0 commit comments