2016-12-29 6 views
0

は今、私は「今、私は、関数の型がJSON方法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$; 

を達成していますが、私はjsonbするJSON形式を変更することはできません、今、私は機能が欲しい、jsonbタイプcloumnの値を変更するには、PostgreSQLの機能を使用したいです達成することができますjsonb_object_set_keyは」、どうもありがとうございました、私を助けてください。

+1

'jsonb_set()'? https://www.postgresql.org/docs/current/static/functions-json.html –

+0

JSONを構築するために生の文字列連結を使用しないでください。理由はありません。そして、エスケープや引用のルールについて心配する必要があります。この関数は、pl/v8でも書かれていればもっと簡単でしょう。あなたは、PostgreSQLの – jpmc26

+0

どのバージョンを使用していますか? – 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あなたがjsonb_setを使用して、少なくとも9.5 conciderを持っている場合:https://www.postgresql.org/docs/current/static/functions-json.htmlあなたが使用していないのはなぜ

+0

を使用していますが、動作しません: –

+0

' {"a":3}をjsonbのタイプに変更すると動作しません: jsonb_in( '{"a":3}') - >> 'a'、5)) –

+0

まだ実行できません。 –

関連する問題