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

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

関連記事

no image

CoreTweetを使って、複数アカウントのコンソールアプリを作ってみた。

CoreTweet使ってみたら、確かに簡単にTwitterへツイートできた。 の続き。   を参考に、自分のフォロワー情報を取得する。 多分というか、勝手な想像だけど、普通に複数のアカウント …

ORACLE:普段使っていないと、どうしても忘れるSQLメモ。

逆引きSQL構文集 文字列を置換する http://www.sql-reference.com/string/translate.html 文字列を連結する http://www.sql-refere …

USB typeCからHDMI2系統への分配器を買ったけど、Macbook Pro では、拡張モードが使えなかった件

先日のAmazonのセールでこれも買ってました。 USB Type CからデュアルHDMI交換アタプタ 4K解像度 2HDMIポート USB 3.0高速ポート USBタイプC PD充電ポート MacB …

fire tv stick 4Kを買った。TVにネットワークがあるにも関わらず、fire tvを選択した理由。

  先日、液晶テレビというものを購入しました。 実家で朝ごはんを食べる時だけ、ニュース番組を流してるぐらいで、ドラマとかバラエティは基本見ない。 というか、テレビのいる部屋にいない。 特にテ …

[ORACLE]Oracle 11g XEの文字コードの変更

Oracle 11g XE を普通にインストールするとUFT-8になりますが、場合に寄っちゃSJISで設定しなきゃいけないときもあるので、その手順。 SJISのdumpを渡される 以前、疑問に思ったの …


カテゴリー