先日、Oracle の VARRAY の Select をしましたが、それの PostgreSQL 版を試す。
まずは create table から。Oracle のように create type は必要なし。
型名(以下の例だと VARCHAR)に、[]、をつけてやれば、それで(上限なしの)配列として定義されるようです。
postgres=# CREATE TABLE tab1( postgres(# no NUMERIC(5), postgres(# list VARCHAR[] postgres(# ) postgres-# ; CREATE TABLE
insert は「array[データの列挙]」か、「'{データの列挙}'」で書ける模様。
ただ「'{データの列挙}'」の場合、文字はシングルクォートで括らずダブルクォートで括るようです。
postgres=# INSERT INTO tab1 VALUES (10, '{"AA", "BB", "CC", "DD", "EE"}'); INSERT 0 1 postgres=# INSERT INTO tab1 VALUES (11, ARRAY['A1', 'B1', 'C1', 'D1', 'E1']); INSERT 0 1 postgres=# INSERT INTO tab1 VALUES (12, ARRAY['A2', 'B2', 'C2']); INSERT 0 1 postgres=# INSERT INTO tab1 VALUES (13, ARRAY['Z3', 'B2', 'C2']); INSERT 0 1
psql.exe 上で select してみるとこんな感じ。
Oracle の場合と大差ない感じですね。
postgres=# SELECT * FROM tab1; no | list ----+------------------ 10 | {AA,BB,CC,DD,EE} 11 | {A1,B1,C1,D1,E1} 12 | {A2,B2,C2} 13 | {Z3,B2,C2} (4 行)
そして、全行の配列要素(=index)が 2 のものだけ抽出…、というのは、Oracle と違い、あっさり、かつ直感的にかけてしまいます(汗
このあたりは Oracle はぜひ見習ってほしい…
postgres=# SELECT no, list[2] FROM tab1; no | list ----+------ 10 | BB 11 | B1 12 | B2 13 | B2 (4 行)