2016-12-29 77 views
0

現在我想使用PostgreSQL功能改變jsonb型cloumn的價值,現在我有一個函數實現的類型JSON在postgresql中如何更改jsonb類型cloumn中的值?

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類型jsonb,現在我想一個函數「 jsonb_object_set_key「誰可以實現,請幫助我,非常感謝。

+1

你爲什麼不使用'jsonb_set()'? https://www.postgresql.org/docs/current/static/functions-json.html –

+0

不要使用原始字符串連接來構建JSON。沒有理由,然後你不得不擔心逃避和引用規則。如果用pl/v8編寫,這個函數可能會更簡單。 – jpmc26

+0

您使用的是哪個版本的PostgreSQL? – jpmc26

回答

-1

只是改變了返回的數據類型:

t=# DROP FUNCTION jsonb_object_set_key(json,text,anyelement); 
DROP FUNCTION 
t=# CREATE OR REPLACE FUNCTION "jsonb_object_set_key"(
t(#  "jsonb"   jsonb, 
t(#  "key_to_set" TEXT, 
t(#  "value_to_set" anyelement 
t(# ) 
t-#  RETURNS jsonb 
t-#  LANGUAGE sql 
t-#  IMMUTABLE 
t-#  STRICT 
t-#  AS $function$ 
t$#  SELECT COALESCE(
t$#  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}') 
t$#   FROM (SELECT * 
t$#     FROM jsonb_each("jsonb") 
t$#     WHERE "key" <> "key_to_set" 
t$#     UNION ALL 
t$#    SELECT "key_to_set", to_jsonb("value_to_set")) AS "fields"), 
t$#  '{}' 
t$# )::jsonb 
t$#  $function$; 
CREATE FUNCTION 

這裏有雲:

t=# select pg_typeof(jsonb_object_set_key('{"a":3}','a',5)); 
jsonb 

ALSE如果您有至少9.5海外商品會有使用jsonb_sethttps://www.postgresql.org/docs/current/static/functions-json.html

+0

當我將'{「a」:3}'更改爲jsonb類型時,它不能工作: –

+0

當我將'{「a」:3}'更改爲jsonb類型時,它無法工作: 選擇pg_typeof(jsonb_object_set_key(jsonb_in('{「a」:3}'),jsonb_in('{「a」:3}') - >>'a',5)) –

+0

它仍然無法運行 –