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

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

関連記事

iphoneを初期化!その時必要なパスワードとは?

入学式シーズンですね。 新しく高校に入るということで、スマホデビューした学生さんも多いんじゃないかなと。 最近は、スマホで完結する事が多いので、PCを持たずに生活している人も多いって聞いたり。 なので …

「TeamViewerが商用環境で使用されているようです。」と表示され、使えなくなった時の対処法。

突然表示された「商用使用の疑い」 いきなりでした。 ちょうど、先週ぐらいにTeamViewerのセッションが突然切れるということが発生。 その時は、気にせず再接続しようとしたら、商用使用の疑いとのこと …

TortoiseSVNを使っていて、”is already locked”が出たので対処法を探して何とかした。

先日から発生しているこのエラー。 いつものエラーね。 じゃあ、クリーンアップを・・・ え?

C# OracleDbAccessを使用して、SQL実行時にORA-00911 文字が無効です のエラー

表題のとおり、C#でOracleDbAccessを使用して、SQLを実行させる時に発生しました。 ネットで探すと、 全角スペースが原因 とか出てきたので、SQL内のスペースを全て半角スペースに置き換え …

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

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


カテゴリー