CREATE OR REPLACE FUNCTION "json_array_update_index"( "json" json, "index_to_update" INTEGER, "value_to_update" anyelement ) RETURNS json LANGUAGE sql IMMUTABLE STRICT AS $function$ SELECT COALESCE( (SELECT ('[' || string_agg("element"::text, ',') || ']') FROM (SELECT CASE row_number() OVER () - 1 WHEN "index_to_update" THEN to_json("value_to_update") ELSE "element" END "element" FROM json_array_elements("json") AS "element") AS "elements"), '[]' )::json $function$;
CREATE OR REPLACE FUNCTION "json_object_set_keys"( "json" json, "keys_to_set" TEXT[], "values_to_set" anyarray ) RETURNS json LANGUAGE sql IMMUTABLE STRICT AS $function$ SELECT COALESCE( (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}') FROM (SELECT * FROM json_each("json") WHERE "key" <> ALL ("keys_to_set") UNION ALL SELECT DISTINCT ON ("keys_to_set"["index"]) "keys_to_set"["index"], CASE WHEN "values_to_set"["index"] IS NULL THEN 'null' ELSE to_json("values_to_set"["index"]) END FROM generate_subscripts("keys_to_set", 1) AS "keys"("index") JOIN generate_subscripts("values_to_set", 1) AS "values"("index") USING ("index")) AS "fields"), '{}' )::json $function$;
CREATE OR REPLACE FUNCTION "jsonb_array_update_by_key"( "jsonb" jsonb, "key" text, "param" text, "value_to_update" anyelement ) RETURNS jsonb LANGUAGE sql IMMUTABLE STRICT AS $function$ SELECT COALESCE( (SELECT ('[' || string_agg("element"::text, ',') || ']') FROM (SELECT CASE "element"->>"key" WHEN "param" THEN "value_to_update"::jsonb ELSE "element" END "element" FROM jsonb_array_elements("jsonb") AS "element") AS "elements"), '[]' )::jsonb $function$;