From 2f6bb6d5d94af1cace33e4ded4dc99e981fc4d43 Mon Sep 17 00:00:00 2001 From: xbgmsharp Date: Sat, 1 Apr 2023 19:25:14 +0200 Subject: [PATCH] Add new public function public.jsonb_diff_val --- initdb/02_5_signalk_api_deps.sql | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/initdb/02_5_signalk_api_deps.sql b/initdb/02_5_signalk_api_deps.sql index ea61e55..b1bc040 100644 --- a/initdb/02_5_signalk_api_deps.sql +++ b/initdb/02_5_signalk_api_deps.sql @@ -300,3 +300,27 @@ $$; COMMENT ON FUNCTION public.jsonb_recursive_merge IS 'Merging JSONB values'; + +-- https://stackoverflow.com/questions/36041784/postgresql-compare-two-jsonb-objects +CREATE OR REPLACE FUNCTION public.jsonb_diff_val(val1 JSONB,val2 JSONB) +RETURNS JSONB AS $jsonb_diff_val$ + DECLARE + result JSONB; + v RECORD; + BEGIN + result = val1; + FOR v IN SELECT * FROM jsonb_each(val2) LOOP + IF result @> jsonb_build_object(v.key,v.value) + THEN result = result - v.key; + ELSIF result ? v.key THEN CONTINUE; + ELSE + result = result || jsonb_build_object(v.key,'null'); + END IF; + END LOOP; + RETURN result; + END; +$jsonb_diff_val$ LANGUAGE plpgsql; +-- Description +COMMENT ON FUNCTION + public.jsonb_diff_val + IS 'Compare two jsonb objects';