2016-12-29 76 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

它仍然无法运行 –