summaryrefslogtreecommitdiff
path: root/src/_posts/2020-12-15-merging-json-in-postgresql.md
diff options
context:
space:
mode:
Diffstat (limited to 'src/_posts/2020-12-15-merging-json-in-postgresql.md')
-rw-r--r--src/_posts/2020-12-15-merging-json-in-postgresql.md50
1 files changed, 0 insertions, 50 deletions
diff --git a/src/_posts/2020-12-15-merging-json-in-postgresql.md b/src/_posts/2020-12-15-merging-json-in-postgresql.md
deleted file mode 100644
index 0d7e087..0000000
--- a/src/_posts/2020-12-15-merging-json-in-postgresql.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-layout: post
-tags: PostgreSQL Programming JSON
-social:
- email: mailto:~tyil/public-inbox@lists.sr.ht&subject=Merging JSON objects in PostgreSQL
-description: >
- Left unsatisfied trying to find a nice way to merge two JSON objects in
- PostgreSQL, I whipped up my own. This small post shows off my glorious
- concoction for future generations."
----
-
-At my `$day-job` we have a lot of `jsonb` in our database. From time to time, I
-have to manually run a query to fix something in there. This week was one of
-those times.
-
-While you can pretty much do everything you need with regards to JSON editing
-with `jsonb_se`t, I thought it might be nice if I were able to *merge* a given
-JSON object into an existing object. This might be cleaner in some situations,
-but mostly it is fun to figure it out. And who doesn’t like spending time with
-`plpgsql`?
-
-The way I wanted to have it work is like this:
-
-{% highlight sql %}
-UPDATE user SET properties = jsonb_merge(properties, '{"notifications": {"new_case": false, "new_document": true}}');
-{% endhighlight %}
-
-And this is the eventual function I produced to do it:
-
-{% highlight sql %}
-CREATE OR REPLACE FUNCTION jsonb_merge(original jsonb, delta jsonb) RETURNS jsonb AS $$
- DECLARE result jsonb;
- BEGIN
- SELECT
- json_object_agg(
- COALESCE(original_key, delta_key),
- CASE
- WHEN original_value IS NULL THEN delta_value
- WHEN delta_value IS NULL THEN original_value
- WHEN (jsonb_typeof(original_value) <> 'object' OR jsonb_typeof(delta_value) <> 'object') THEN delta_value
- ELSE jsonb_merge(original_value, delta_value)
- END
- )
- INTO result
- FROM jsonb_each(original) e1(original_key, original_value)
- FULL JOIN jsonb_each(delta) e2(delta_key, delta_value) ON original_key = delta_key;
- RETURN result;
-END
-$$ LANGUAGE plpgsql;
-{% endhighlight %}