11

私は次のデータを持っています:

name          id             url

John          1              someurl.com
Matt          2              cool.com
Sam           3              stackoverflow.com

PostgresでSQLステートメントを記述して、このデータを多次元配列に選択するにはどうすればよいですか。

{{John, 1, someurl.com}, {Matt, 2, cool.com}, {Sam, 3, stackoverflow.com}}

私は以前にPostgresでこの種の配列の使用法を見たことがありますが、テーブルからこの配列形式にデータを選択する方法がわかりません。

ここで、すべての列がタイプであると仮定しますtext

4

2 に答える 2

21

array_agg()少なくともPostgreSQL9.4までは、多次元配列の作成に使用することはできません。
(しかし、次のPostgres 9.5には、その缶の新しいバリアントがarray_agg()出荷されます!)

@Matt Ballのクエリから得られるのは、レコードの配列(the_table[])です。

配列は、同じ基本型の要素のみを保持できます。あなたは明らかに数字と文字列のタイプを持っています。すべての列(まだ変換されていない)をtextに変換して、機能させます。

前にここで示したように、このための集計関数を作成できます。

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

電話:

SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
FROM   tbl;

ARRAY[]多次元配列(正確には2次元)にするための追加のレイヤーに注意してください。

インスタントデモ:

WITH tbl(id, txt) AS (
    VALUES
      (1::int, 'foo'::text)
     ,(2,      'bar')
     ,(3,      '}b",') -- txt has meta-characters
    )
    , x AS (
    SELECT array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS t
    FROM   tbl
    )
SELECT *, t[1][3] AS arr_element_1_1, t[3][4] AS arr_element_3_2
FROM   x;
于 2012-08-01T16:06:24.703 に答える
8

集計関数を使用する必要があります; array_aggあなたが必要なことをする必要があります。

SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s;
于 2012-08-01T15:25:16.243 に答える