我使用下面的代码创建一个函数,该函数使用json对象更新jsonb列,如果它不存在,则创建它-在此帖子的帮助下
然而,我真的有麻烦插入变量$2和$3在json字符串。有什么建议吗?
CREATE OR REPLACE FUNCTION public.updateoffset(site text, offsetnumber integer, toscrape integer)
RETURNS void
LANGUAGE sql
AS $function$
update settings set "offset" = coalesce("offset", '{}') || '{"$2": {"toscrape":3$}}'
where site = $1;
$function$
不要使用字符串插值来构建JSON值-使用JSON函数和操作符代替,特别是json_build_object
:
update settings
set "offset" = coalesce("offset", '{}') || json_build_object($2, json_build_object('toscrape', $3))
where site = $1;
也可以更简单地使用json_set
:
update settings
set "offset" = json_set(coalesce("offset", '{}'), ARRAY[$2::text,'toscrape'], $3)
where site = $1;
(但是,它在内部对象中保留了其他属性,而不是将其完全替换为只有toscrape
作为键的对象)
使用format()函数
...
update settings
set "offset" =
coalesce("offset", '{}') || format('{"%s": {"toscrape":%s}}', $2, $3)::jsonb
where site = $1;
...