json 字符串中的插值变量

Interpolating variables in json string

我正在使用下面的代码创建一个带有变量的函数,该函数使用 json 对象更新 jsonb 列,如果它不存在则创建它 -

然而,我在 json 字符串中插入变量 $2 和 $3 时确实遇到了问题。有什么建议吗?

CREATE OR REPLACE FUNCTION public.updateoffset(site text, offsetnumber integer, toscrape integer)
 RETURNS void
 LANGUAGE sql
AS $function$


 update settings set "offset" = coalesce("offset", '{}') || '{"": {"toscrape":3$}}'
  where site = ;
$function$ 

使用函数format().

...
  update settings
  set "offset" = 
    coalesce("offset", '{}') || format('{"%s": {"toscrape":%s}}', , )::jsonb
  where site = ;
...

不要使用字符串插值来构建 JSON 值 - 请改用 JSON functions and operators,尤其是 json_build_object:

update settings
set "offset" = coalesce("offset", '{}') || json_build_object(, json_build_object('toscrape', ))
where site = ;

另外使用起来可能更简单 json_set:

update settings
set "offset" = json_set(coalesce("offset", '{}'), ARRAY[::text,'toscrape'], )
where site = ;

(但是,它确实在内部对象中保留了其他属性,而不是用只有 toscrape 作为键的对象完全替换它)