Re: [HACKERS] JSONB - JSONB operator feature request
От | David Fetter |
---|---|
Тема | Re: [HACKERS] JSONB - JSONB operator feature request |
Дата | |
Msg-id | 20170718174924.GH11340@fetter.org обсуждение исходный текст |
Ответ на | [HACKERS] JSONB - JSONB operator feature request (david.turon@linuxbox.cz) |
Ответы |
Re: [HACKERS] JSONB - JSONB operator feature request
|
Список | pgsql-hackers |
On Tue, Jul 18, 2017 at 01:36:32PM +0200, david.turon@linuxbox.cz wrote: > Hi, > > some users and me used hstore - hstore for example storing only changed > rows in trigger like: > > hsore(NEW) - hstore(OLD) > > There isn't same operator/function in JSON/JSONB. We can only remove keys > from JSONB, but not equal key-value pairs. Is there any chance to have > same feature with JSON/JSONB in postgres core? Here's one slightly modified from http://coussej.github.io/2016/05/24/A-Minus-Operator-For-PostgreSQLs-JSONB/ CREATE OR REPLACE FUNCTION jsonb_minus ( arg1 jsonb, arg2 jsonb ) RETURNS jsonb LANGUAGE sql AS $$ SELECT COALESCE(json_object_agg( key, CASE -- if the value is an object and the value of the secondargument is -- not null, we do a recursion WHEN jsonb_typeof(value) = 'object' AND arg2 -> keyIS NOT NULL THEN jsonb_minus(value, arg2 -> key) -- for all the other types, we just return the value ELSE value END ), '{}')::jsonb FROM jsonb_each(arg1) WHERE arg1 -> key IS DISTINCT FROM arg2 -> key $$; CREATE OPERATOR - ( PROCEDURE = jsonb_minus, LEFTARG = jsonb, RIGHTARG = jsonb ); I suspect that there's a faster way to do the jsonb_minus function internally. Best, David. -- David Fetter <david(at)fetter(dot)org> http://fetter.org/ Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com Remember to vote! Consider donating to Postgres: http://www.postgresql.org/about/donate
В списке pgsql-hackers по дате отправления: