PostgreSQL で SELECT の結果を配列として返す

2007年 3月 10日 01:46

PostgreSQL で 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)

どうでしょうか?
これだとかなり分かりやすくなったかと思います。プログラム側の処理も簡単になるので、より効率的にプログラムが組めるかなって思います。

実際に使ってみると結構便利ですので、試してみてもらえればと思います。


トラックバック URL


※言及リンクのないトラックバックは削除されます。
※書き込まれてから公開されるまで時間がかかる場合があります。

コメントをどうぞ

Spam protection by WP Captcha-Free

※書き込まれてから公開されるまで時間がかかる場合があります。