2016-12-29 5 views
0

는 지금은 "지금은 함수 유형의 JSONpostgresql에서 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 "달성 할 수있는 사람, 도와주세요, 대단히 감사합니다. 여기

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 

가 간다 :

+1

를 왜 사용하지 않습니다 'jsonb_set()'? https://www.postgresql.org/docs/current/static/functions-json.html –

+0

JSON 작성시 원시 문자열 연결을 사용하지 마십시오. 그럴 이유가 없기 때문에 탈출과 룰을 인용하는 것에 대해 걱정해야합니다. 이 기능은 pl/v8로 작성된 경우 아마 더 간단 할 것입니다. – jpmc26

+0

어떤 버전의 PostgreSQL을 사용하고 있습니까? – jpmc26

답변

-1

는 반환 데이터 형식을 변경

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

당신이 적어도 9.5 재질 - 구글 번역 참고가 jsonb_set를 사용하는 경우합니다 alse : https://www.postgresql.org/docs/current/static/functions-json.html

+0

을 사용하면 작동하지 않습니다 : –

+0

'{ "a": 3} '을 jsonb 유형으로 변경하면 작동하지 않습니다 : (jsonb_in ('{ "a": 3}'), jsonb_in ('{ "a": 3}') -> 'a', 5)) –

+0

여전히 실행할 수 없습니다. –