PostGreSQL 中Json Array 賦值方法總結

Json 數據類型在PostGreSQL中無疑是其較其餘關係型數據庫的一大亮點,能夠存儲對象,相似nosql的文檔數據類型啦,固然如今MySQL的最新版本中也包含了Json數據類型,因此好好總結下Json的用法仍是頗有必要的,這裏主要針對Json Array 的賦值方法作個小結,由於在項目中用的還蠻多。sql

一、更新指定索引下json值 (json array)

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$;

二、設置指定索引下的json值,沒有則設置默認值(json array)

CREATE OR REPLACE FUNCTION "json_array_set_index"( "json" json, "index_to_set" INTEGER, "value_to_set" anyelement, "default_to_fill" json DEFAULT 'null' ) RETURNS json LANGUAGE sql IMMUTABLE STRICT AS $function$ SELECT COALESCE( (SELECT ('[' || string_agg("element"::text, ',') || ']') FROM (SELECT CASE "index" WHEN "index_to_set" THEN to_json("value_to_set") ELSE COALESCE("json" -> "index", "default_to_fill") END "element" FROM generate_series(0, GREATEST("index_to_set", json_array_length("json") - 1)) AS "index") AS "elements"), '[]' )::json $function$;

三、設置指定鍵值下對應的數據(json)

CREATE OR REPLACE FUNCTION "json_object_set_key"( "json" json, "key_to_set" TEXT, "value_to_set" anyelement ) 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" <> "key_to_set" UNION ALL SELECT "key_to_set", to_json("value_to_set")) AS "fields"), '{}' )::json $function$;

四、設置鍵值數組對應的數組數據(批量更新)(json array)

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$;

五、更新jsonb array 指定key下的json 數據,能夠經過param進行指定賦值

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$;

以上內容並不是所有本身創造,參考了stackoverflow一些大神的寫法,進行部分改造。數據庫

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。json

相關文章
相關標籤/搜索