11gR2からGROUP_CONCAT(複数行をまとめて1列に)が可能に
http://d.hatena.ne.jp/kkz_tech/20150311/1426048592
これだよこれ。
GROUP CONCAT関数で対応できるみたいなんだけど、でもさ・・・
使用例のSQL見てみたけど、長大なSQLを修正するときに、対応させるのは無理だと判断。
新規で作るならともかくね・・・
ということで、このLISTAGG関数を使うことに。
ちょうど、現状で使用しているOracleのバージョンは11gR2なので使用可能でした。
通常、SQLの検索結果で複数行出力されてしまうものを1列にまとめることが出来ます。
例
a a1 a a2 a a3 a a4 :こんな出力を
a a1,a2,a3,a4.. ※この例では、「,」を区切り文字にしてます。このように。
select seq ,listagg(t_seq.name ,'<span style="color: #ff0000;">,</span>') within group (order by t_seq.name ) as name from t_seq group by seq ; ※この例では、「,」を区切り文字にしてます。こんな書き方で出力を1列にまとめることが出来ました。
within区以降は、お約束って感じでツラツラと。
並び順を意識しないのであれば、列名を指定せず、「null」にしてもいい。注意というか、注意でもないんだけどw
複数行を1列に出力する性質上、GROUP BY が必須となるので、長大なSQLの修正で組み込む場合は、注意が必要かもしれない。
これは個人的な感覚だけど、全項目を漏れなくGROUP BY句にぶち込むのは、SQLが長くなるだけでなく、メンテナンス製が下がるので・・・なので、今回は最終的に、サブクエリとして元のSQLにJOINして対応しました。
めでたしめでたしw
[…] OracleでLISTAGG関数を使ったら、世界が変わった話。 […]