2013-01-10 54 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