OracleでLISTAGG関数を使ったら、世界が変わった話。

投稿日:2017-05-12

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, PC
-,


  1. […] OracleでLISTAGG関数を使ったら、世界が変わった話。 […]

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ウェブブラウザでテキスト入力する方法

TechWave テックウェーブ #wave 176 Shares 32 Users 145 Pocketsウェブブラウザを「テキストエディタ」にする方法 【増田 @maskin】 | TechWav …

新型MacbookPro 2016(Late 2016)を買うかどうか非常に迷っている話。

どうしても、定期的に上がってしまうこの話題というか、欲しいから検討するんだけど、あと一歩が踏み出せない・・・ 日本の中心付近で仕様変更と闘うSE日記MacBookAir 11 Early2014 では …

OracleでORA-01747 : 指定された列が無効ですのエラーの分かりづらさ・・・

OracleでORA-01747 : 指定された列が無効ですのエラーの分かりづらさったらありません・・・ SQLのUPDATE文の実行時に 「ORA-01747 : 指定された列が無効です」 とエラー …

Oracleで複数レコードを更新する方法

UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。 基本的に、今まで使ってきたUPDATE文では、 UPDATE tableA set COL1 = 1 ,COL …

partition by を使って、ORACLEで、グループ毎に1行だけ取得する。

グループ単位で一番小さいとか、一番大きいとかだけなら、MinやMaxを使って外部結合で対応できるんだけど、1番目2番目3番目を1列で取得しなきゃいけない状態になったので、調べて解決。 「partiti …


カテゴリー