我在postgres中使用plsql函数循环遍历大型数据集,并使用每个记录中的数据生成字符串。出于某种原因,我得到了不需要的额外双引号:
'{ ""id"": ""1""}'
它应该看起来像
'{ "id": "1"}'
另外,我在字符串的开头和结尾都注意到了不需要的括号。我正在使用的代码如下:
CREATE FUNCTION gen_blocks()
RETURNS TEXT AS $$ DECLARE
output TEXT := '';
j record; BEGIN
FOR j IN SELECT '{ "id": "' || id ||'"},' LOOP
output := output || j;
END LOOP;
return output; END; $$ LANGUAGE plpgsql;
有什么想法吗?
答案 0 :(得分:5)
你的问题就在这里:
output := output || j;
您的j
是record
,而不是字符串类型。因此,PostgreSQL必须为您的record
字符串化。这就是你的报价加倍发生的地方。您不希望将j
连接到输出缓冲区,而是希望连接j
中的第一列;一个简单的解决方案是为字符串计算添加别名,以便您可以按名称引用它:
FOR j IN SELECT '{ "id": "' || id ||'"},' as s LOOP
output := output || j.s;
END LOOP;
您也可以跳过自定义功能,只需使用string_agg
:
string_agg(expression, delimiter)
输入值连接成一个字符串,用分隔符
分隔
这样的事情:
select string_agg('{ "id": "' || id || '" }', ',') from ...
这将带来额外的好处,即最后不包括流浪逗号(一些JavaScript和JSON解析器会对此感到不安)。