X-Git-Url: https://git.8kb.co.uk/?p=postgresql%2Fpg_jsonb_delete_op;a=blobdiff_plain;f=pg_jsonb_delete_op.sql;fp=pg_jsonb_delete_op.sql;h=7a8ee287acbc3d5aef8c2ea5d50ee58e427742c1;hp=0000000000000000000000000000000000000000;hb=820747d1f09e01a242e0b6906ae3161628d70734;hpb=b44f202e1b15533492adc3c36fe6e268c90f34bc diff --git a/pg_jsonb_delete_op.sql b/pg_jsonb_delete_op.sql new file mode 100755 index 0000000..7a8ee28 --- /dev/null +++ b/pg_jsonb_delete_op.sql @@ -0,0 +1,61 @@ +-- +-- Glyn Astill 16/01/2015 +-- Attempt at hstore style delete operator for jsonb +-- + +SET search_path = 'public'; + +CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b text) +RETURNS jsonb AS +$BODY$ + SELECT COALESCE( + ( + SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}') + FROM jsonb_each(a) + WHERE NOT ('{"' || key || '":' || value || '}')::jsonb ? b + ) + , '{}')::jsonb; +$BODY$ +LANGUAGE sql IMMUTABLE STRICT; +COMMENT ON FUNCTION jsonb_delete_left(jsonb, text[]) IS 'delete key in second argument from first argument'; + +CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = text); +COMMENT ON OPERATOR - (jsonb, text[]) IS 'delete key from left operand'; + +-- + +CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b text[]) +RETURNS jsonb AS +$BODY$ + SELECT COALESCE( + ( + SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}') + FROM jsonb_each(a) + WHERE NOT ('{"' || key || '":' || value || '}')::jsonb ?| b + ) + , '{}')::jsonb; +$BODY$ +LANGUAGE sql IMMUTABLE STRICT; +COMMENT ON FUNCTION jsonb_delete_left(jsonb, text[]) IS 'delete keys in second argument from first argument'; + +CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = text[]); +COMMENT ON OPERATOR - (jsonb, text[]) IS 'delete keys from left operand'; + +-- + +CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b jsonb) +RETURNS jsonb AS +$BODY$ + SELECT COALESCE( + ( + SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}') + FROM jsonb_each(a) + WHERE NOT ('{"' || key || '":' || value || '}')::jsonb <@ b + ) + , '{}')::jsonb; +$BODY$ +LANGUAGE sql IMMUTABLE STRICT; +COMMENT ON FUNCTION jsonb_delete_left(jsonb, jsonb) IS 'delete matching pairs in second argument from first argument'; + +CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = jsonb); +COMMENT ON OPERATOR - (jsonb, jsonb) IS 'delete matching pairs from left operand';