【问题标题】:postgres/plsql generated string creates extra double quotespostgres/plsql 生成的字符串创建额外的双引号
【发布时间】:2013-01-10 14:48:50
【问题描述】:

我在 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;

有什么想法吗?

【问题讨论】:

标签: database string postgresql plpgsql


【解决方案1】:

你的问题就在这里:

output := output || j;

您的jrecord,而不是字符串类型。所以,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 解析器会对此感到不安)。

【讨论】:

  • 哇,谢谢!我已经有一段时间了,完全被难住了。我会给你一个 +2 的 string_agg!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多