postgres/plsql生成的字符串创建额外的双引号

max*_*mus 1 database string postgresql plpgsql

我在postgres中使用plsql函数循环遍历大型数据集,并使用每个记录中的数据生成字符串.出于某种原因,我得到了不必要的额外双引号,如下所示:

'{ ""id"": ""1""}'
Run Code Online (Sandbox Code Playgroud)

它应该看起来像

'{ "id": "1"}'
Run Code Online (Sandbox Code Playgroud)

另外,我注意到字符串开头和结尾有不需要的括号.我正在使用的代码如下:

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;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mu *_*ort 5

你的问题就在这里:

output := output || j;
Run Code Online (Sandbox Code Playgroud)

j是一个record,而不是一个字符串类型.因此,PostgreSQL必须为您record进行字符串化.这就是你的报价加倍发生的地方.你不想连接j到你的输出缓冲区,你想连接第一列j; 一个简单的解决方案是为字符串计算添加一个别名,以便您可以按名称引用它:

FOR j IN SELECT '{ "id": "' || id ||'"},' as s LOOP
    output := output || j.s;
END LOOP;
Run Code Online (Sandbox Code Playgroud)

您也可以跳过自定义功能,只需使用string_agg:

string_agg(expression, delimiter)

输入值连接成一个字符串,用分隔符分隔

像这样的东西:

select string_agg('{ "id": "' || id || '" }', ',') from ...
Run Code Online (Sandbox Code Playgroud)

这将带来额外的好处,即最后不包括流浪逗号(一些JavaScript和JSON解析器会对此感到不安).