1

私が持っている場合

create table t1( attr text primary key, val text );
insert into t1 values( 'attr1', 'val1' );
insert into t1 values( 'attr2', 'val3' );
insert into t1 values( 'attr3', 'val3' );

select1行を返したい

attr1=>val1, attr2=>val2, attr3=>val3

pg現在JavaScriptで変換を行っていますが、行自体を返すといいでしょう


答え

@muの回答に基づいて、クエリ:

select replace( replace( replace( array_agg( hstore( attr, val ) )::text
   '"\"', '"'), 
   '\""', '"'),
   '\"=>\"', '":"')  from t1;

結果:

{"attr1":"val1","attr2":val2","attr3":"val3"}

これは非常に優れた JSON です (値に引用符がない限り)

4

2 に答える 2

3

で使えると期待していましarray_to_jsonarray_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 メーリング リストの投稿

于 2012-08-05T05:40:26.507 に答える
1

hstoreがインストールされている場合は、次を使用できますarray_agg

select array_agg(attr => val) from t1;

これにより、探している出力が正確に得られます。もちろん、使用しているインターフェイスが何であれ、hstore と配列を理解する必要があるか、自分で結果を展開する必要があります。その場合は、単純なselect attr, val from t1クエリを繰り返し処理し、JavaScript でデータ構造を構築する方がおそらく簡単でしょう。

于 2012-08-05T04:42:46.793 に答える