1

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;

何か案は?

4

1 に答える 1

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 パーサーはこれに腹を立てます)。

于 2013-01-10T06:48:50.280 に答える