2013-01-10 19 views
1

我在postgres中使用plsql函数来循环访问大型数据集,并使用每条记录中的数据生成一个字符串。出于某种原因,我越来越不需要额外的双引号是这样的: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; 

任何想法?

+2

如果你在9.2上,你可以使用'row_to_json()':http://www.postgresql.org/docs/9.2/static/functions-json.html –

+0

谢谢,这很好,但是我知道,对9.1而言,暂时不能更改版本。 – maximus

回答

5

你的问题就在这里:

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解析器会感到不安)。

+0

哇,谢谢!我曾经呆过一段时间,完全被困住了。我会给你一个+2的string_agg! – maximus