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

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

関連記事

続) 何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

この土日は休日出勤でした・・・ そして、昨日・・・新しい現象が発生しました。 日本の中心付近で仕様変更と闘うSE日記日本の中心付近で仕様変更と闘うSE日記http://ht-jp.net/blog/p …

no image

割と聡明気?からMVNOを使ってる自分が、これからもMVNOを使って、キャリアのデータ定額を多分契約しない理由。

とある家電量販店にあるdocomoショップ?に行ってきた。 本来は修理依頼、もしくは修理期間・費用の確認をしようと思って聞いてみたわけ。 ガラケーを持ってねw もう、7、8年前の本体についての質問を割 …

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

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

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

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

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …


カテゴリー