複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。
通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。
いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。
条件
テーブル
tab1
tab2
tab1 のカラム
seqnumber
name
add
・
・
tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo
・
・
クエリ生成
select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS combine,name,add from tab1 where seqnumber=7777;
このような表現でOK
大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。
たとえば、
select seqnumber,number||memo,name,add from tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;
この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。
何気にすごく使える。
本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html