Initial commit
[postgresql/pg_jsonb_delete_op] / pg_jsonb_delete_op.sql
1 -- 
2 -- Glyn Astill 16/01/2015
3 -- Attempt at hstore style delete operator for jsonb
4 --
5
6 SET search_path = 'public';
7
8 CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b text) 
9 RETURNS jsonb AS 
10 $BODY$
11     SELECT COALESCE(            
12         (
13             SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}')
14             FROM jsonb_each(a)
15             WHERE NOT ('{"' || key || '":' || value || '}')::jsonb ? b
16         )
17     , '{}')::jsonb;
18 $BODY$
19 LANGUAGE sql IMMUTABLE STRICT;
20 COMMENT ON FUNCTION jsonb_delete_left(jsonb, text[]) IS 'delete key in second argument from first argument';
21
22 CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = text);
23 COMMENT ON OPERATOR - (jsonb, text[]) IS 'delete key from left operand';
24
25 --
26
27 CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b text[]) 
28 RETURNS jsonb AS 
29 $BODY$
30     SELECT COALESCE(            
31         (
32             SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}')
33             FROM jsonb_each(a)
34             WHERE NOT ('{"' || key || '":' || value || '}')::jsonb ?| b
35         )
36     , '{}')::jsonb;
37 $BODY$
38 LANGUAGE sql IMMUTABLE STRICT;
39 COMMENT ON FUNCTION jsonb_delete_left(jsonb, text[]) IS 'delete keys in second argument from first argument';
40
41 CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = text[]);
42 COMMENT ON OPERATOR - (jsonb, text[]) IS 'delete keys from left operand';
43
44 --
45
46 CREATE OR REPLACE FUNCTION jsonb_delete_left(a jsonb, b jsonb) 
47 RETURNS jsonb AS 
48 $BODY$
49     SELECT COALESCE(            
50         (
51             SELECT ('{' || string_agg(to_json(key) || ':' || value, ',') || '}')
52             FROM jsonb_each(a)
53             WHERE NOT ('{"' || key || '":' || value || '}')::jsonb <@ b
54         )
55     , '{}')::jsonb;
56 $BODY$
57 LANGUAGE sql IMMUTABLE STRICT;
58 COMMENT ON FUNCTION jsonb_delete_left(jsonb, jsonb) IS 'delete matching pairs in second argument from first argument';
59
60 CREATE OPERATOR - ( PROCEDURE = jsonb_delete_left, LEFTARG = jsonb, RIGHTARG = jsonb);
61 COMMENT ON OPERATOR - (jsonb, jsonb) IS 'delete matching pairs from left operand';