PostgreSQL で SELECT の結果を配列として返す
2007年 3月 10日 01:46PostgreSQL で SELECT の結果を配列として返す方法をメモしておきます。
具体的に説明しないと、分かりにくいと思いますので、とりあえず、次のような data テーブルと tag テーブルという2つのテーブルがあったとして話を進めます。 data テーブルはいろいろな情報が入っているテーブルで tag テーブルっていうのは各 data テーブルの情報に付けられたタグを表します。
data テーブル data_no | data_text ---------+-------------- 1 | サーバ情報 2 | 経費一覧表 3 | デジカメ画像 (3 rows) tag テーブル data_no | tag_name ---------+-------------- 1 | 仕事 1 | サーバ 2 | 仕事 2 | お金 3 | プライベート 3 | ホビー 3 | 画像 (7 rows)
で、こうしたテーブルで各 data テーブルに付けられたタグを見たい場合に、単純にJOINをしてしまうと、次のような感じになってしまうかと思います。
SELECT d.data_no, d.data_text, t.tag_name FROM data d JOIN tag t USING (data_no); data_no | data_text | tag_name ---------+--------------+-------------- 1 | サーバ情報 | 仕事 1 | サーバ情報 | サーバ 2 | 経費一覧表 | 仕事 2 | 経費一覧表 | お金 3 | デジカメ画像 | プライベート 3 | デジカメ画像 | ホビー 3 | デジカメ画像 | 画像 (7 rows)
これでも、一応、各 data テーブル毎に付けられたタグは分かるのですが、タグの数分だけ data テーブルが冗長になってしまっています。このまま冗長なデータを飛ばし読みしながら取得してもいいのですが、それをプログラム側でやるのはなんとも面倒で、バグの温床になりそうです。
そこで、これをARRAYを使って書き直してみます。
SELECT d.data_no, d.data_text, ARRAY(SELECT tag_name FROM tag t WHERE t.data_no = d.data_no) FROM data d;
data_no | data_text | ?column?
---------+--------------+----------------------------
1 | サーバ情報 | {仕事,サーバ}
2 | 経費一覧表 | {仕事,お金}
3 | デジカメ画像 | {プライベート,ホビー,画像}
(3 rows)
どうでしょうか?
これだとかなり分かりやすくなったかと思います。プログラム側の処理も簡単になるので、より効率的にプログラムが組めるかなって思います。
実際に使ってみると結構便利ですので、試してみてもらえればと思います。
