2016-12-29 2 views
0

Теперь я хочу использовать функцию PostGreSQL, чтобы изменить значение типа jsonb cloumn, теперь у меня есть функция достижения типа JSONВ postgresql как изменить значение в jsonb type 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_set: https://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

Он по-прежнему не может работать –