で使えると期待していましarray_to_json
たarray_agg
。使用方法についてはPostgreSQL 9.2 jsonのドキュメントを参照してください。また、 9.2 がリリースされるまで PostgreSQL 9.1 で使用するために JSON 機能をバックポートするjson91モジュールを参照するか、9.2 ベータ版を使用してください。
残念ながら、現時点では json のマージ、集約などはサポートされていないようです。そのため、JSON 値を作成するのは驚くほど困難です。私は通常のテキスト演算子でそれをやっただけでしたが、それでは引用の問題は許されません。
regress=# SELECT '{'||string_agg('"'||attr||'": "'||val||'"', ', ')||'}' FROM t1;
?column?
-----------------------------------------------------
{"attr1": "val1", "attr2": "val3", "attr3": "val3"}
(1 row)
見る:
regress=# insert into t1 (attr,val) values ('at"tr', 'v"a"l');
INSERT 0 1
regress=# SELECT '{'||string_agg('"'||attr||'": "'||val||'"', ', ')||'}' FROM t1;
?column?
-----------------------------------------------------------------------
{"attr1": "val1", "attr2": "val3", "attr3": "val3", "at"tr": "v"a"l"}
(1 row)
regress=# SELECT ('{'||string_agg('"'||attr||'": "'||val||'"', ', ')||'}')::json FROM t1;
ERROR: invalid input syntax for type json
DETAIL: line 1: Token "tr" is invalid.
回答に追加したソリューションにも同じ問題が存在します。それに対する適切な答えとして、 のような関数が必要ですがjson_escape_literal
、現在、SQL に公開されているようなものはありません。
Pg の現在の json 機能セットで私が目にする唯一の安全なアプローチは、ペアの配列を生成することですが、それは通常の行指向のクエリで得られるものよりも優れているわけではありません。
regress=# SELECT array_to_json( array_agg( array_to_json( ARRAY[attr, val] ) )) FROM t1;
array_to_json
---------------------------------------------------------------------------
[["attr1","val1"],["attr2","val3"],["attr3","val3"],["at\"tr","v\"a\"l"]]
hstore と json を組み合わせてやりたいことができるかもしれませんが、それは拡張機能のスープになります。これが本当に必要とするのは、と同等のjsonオブジェクトコンストラクター関数ですhstore(text[],text[])
。これにより、次のjsonと同等のことができます。
select hstore( array_agg(attr), array_agg(val) ) from t1;
更新:このトピックに関する pgsql-general メーリング リストの投稿