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
作为键的对象完全替换它)
我正在使用下面的代码创建一个带有变量的函数,该函数使用 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
作为键的对象完全替换它)