../../image/benilogo.gifPostgreSQL について


PostgreSQL のfield 配列について。
配列型

   配列についての マニュアル

マニュアルに沿って簡単な配列テーブルを作ってみる。
integer型の 配列Field の作成
beniya=# create table arry1( ai integer[]);
CREATE
beniya=# select \d arry1;
         Table "arry1"
 Column |   Type    | Modifiers
--------+-----------+-----------
 ai     | integer[] |

   ai integer[] となり これが配列型です。
   前に出てきた timestamp[] これもなんのことはない timestampの配列型に
   なっているだけの話です。 
   


そして INSERT 文で 実際にデーターを入れてみることにする。
beniya=# INSERT INTO arry1 VALUES('{ 123,456 }');
ERROR:  pg_atoi: error in "456 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES('{ 123,456 }');
ERROR:  pg_atoi: error in "456 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES({ 123,456 });
ERROR:  parser: parse error at or near "{"
beniya=# INSERT INTO arry1 VALUES({ 123,456 });
ERROR:  parser: parse error at or near "{"
beniya=# INSERT INTO arry1 VALUES([ 123,456 ]);
ERROR:  parser: parse error at or near "["
beniya=# INSERT INTO arry1 VALUES('[ 123,456 ]');
ERROR:  array_in: missing dimension value
beniya=# INSERT INTO arry1 VALUES('[ 123, 456 ]');
ERROR:  array_in: missing dimension value
beniya=# INSERT INTO arry1 VALUES('{ 123, 456 }');
ERROR:  pg_atoi: error in "456 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES('{ 123 }');
ERROR:  pg_atoi: error in "123 ": can't parse " "
beniya-# INSERT INTO arry1 VALUES(ai, '{ 123 }');
ERROR:  parser: parse error at or near "VALUES"
beniya=# INSERT INTO arry1 VALUES(ai '{ 123 }');
ERROR:  Unable to locate type name 'ai' in catalog
beniya=# INSERT INTO arry1 VALUES(integer '{ 123 }');
ERROR:  pg_atoi: error in "{ 123 }": can't parse "{ 123 }"
beniya=# INSERT INTO arry1 VALUES ( '{ 123 , 456  }');
ERROR:  pg_atoi: error in "123 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES ( '{123,456}');
INSERT 22194 1
beniya=# select * from arry1;
    ai
-----------
 {123,456}
(1 row)


 これではエラーになる。

  なんでだろう? と いろいろ形を変えてやってみる。
 


 

















  あっ!! これで出来た。 前の空白がダメなのだ。
  そうでもなさそうです。





beniya=# INSERT INTO arry1 VALUES ( '{888, 777, 999, 022, 131}');
INSERT 22196 1
beniya=# INSERT INTO arry1 VALUES ( '{ 888, 777, 999, 022, 131}');
INSERT 22197 1
beniya=# INSERT INTO arry1 VALUES ( '{ 777, 777, 999, 022, 131}');
INSERT 22198 1
beniya=# INSERT INTO arry1 VALUES ( '{ 123 , 456  }');
ERROR:  pg_atoi: error in "123 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES ( '{ 123 , 456}');
ERROR:  pg_atoi: error in "123 ": can't parse " "
beniya=# INSERT INTO arry1 VALUES ( '{ 123, 456}');
INSERT 22199 1

  試しに これまた いろいろ入力してみる。

← これは先頭に空白なし  OK

← 先頭空白あり む・・ OK になっている。



← 数字の前後に空白を入れてみる NG  



← 数字の後ろの空白をなくすると OK


なるほど そう言うわけなんですね。

じゃあ 次にこれを表示する時はどうなるんだろう?
integer型の 配列Field の表示
beniya=# select * from arry1;
          ai
----------------------
 {123,456}
 {123,456,789,11,421}
 {888,777,999,22,131}
 {888,777,999,22,131}
 {777,777,999,22,131}
 {123,456}
(6 rows)

   こうすると全部表示出来た。
beniya=# select ai[1] from arry1; beniya=# select ai[2] from arry1; beniya=# select ai[3] from arry1;
beniya=# select ai[1] from arry1;
 ai
-----
 123
 123
 888
 888
 777
 123
(6 rows)

beniya=# select ai[2] from arry1;
 ai
-----
 456
 456
 777
 777
 777
 456
(6 rows)

beniya=# select ai[3] from arry1;
 ai
-----

 789
 999
 999
 999

(6 rows)

beniya=# select ai from arry1
beniya-# where ai[3] > 900;
          ai
----------------------
 {888,777,999,22,131}
 {888,777,999,22,131}
 {777,777,999,22,131}
(3 rows)

  • であるならばこんなことも可能なはず。 出来た。

これを Windows から ODBC 経由で 見るとどうなっているのだろうか?  確認実験 または MS-ACCESSからの確認実験



戻る ・・・・




Last Update 2006/05/30  14:52 JST

(C) Y.Kondou,2004,2006 All Rights, Reserved.
その他、お気づきの点がありましたら連絡先はこちらから