OracleでLISTAGG関数を使ったけど、世界を変えられなかった話・・・

投稿日:2017-05-13

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


はい、休日出勤でした。
そして、休日出勤の結果、以下のことが分かりました(泣

の後日談というか、結局駄目でしたっていう話。

原因は調べ切れてないけど、連結したテーブルの項目が表示できなかったので、最終的に取得後に件数分のループを回して必要な文字列を構成するという手段を取らざるを得なかった。ぐぬぬ・・・

a a1
a a2
a a3
a a4
:

こんな出力を

a a1,a2,a3,a4..
※この例では、「,」を区切り文字にしてます。

こんな風に表示を出来てて当初問題なかったんですが、実際に必要とする出力結果では、
「a a1」
では無く、
「あ a1」※「あ」は「a」に対応するマスタの名称
とする必要があったわけ。

そのため、前回書いたようにこう書くのではなく・・・

select
seq
,listagg(t_seq.name ,',') within group (order by t_seq.name ) as name
from
t_seq
group by
seq
;
※この例では、「,」を区切り文字にしてます。

こう書く必要があるわけです。

SELECT
seq
,LISTAGG(m_data.name ,',') WITHIN GROUP (ORDER BY m_data.name ) AS name
FROM
t_seq
LEFT JOIN m_data
ON  t_seq.seq = m_data.seq
GROUP BY
seq
;
※この例では、「,」を区切り文字にしてます。

で、このとき、出力結果が正しく表示されなくなったんです。
SQLの使用環境によるかもしれませんが、sqldeveloperで実行しても正しく表示できなかったので今回は使用を見送ることにしました。
実行環境に左右される状況では、ちょっと使えなかった。
ただ、テーブルの連結をしていても、連結したテーブルの項目を使わなければ表示は問題なかったので、原因が分かったら積極的に使って行きたいなと。







-ORACLE
-,


comment

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

関連記事

[ORACLE]今接続しているサーバー・スキーマとかを確認する

Oracle使ってる時に、今どのサーバーに繋いでるの?とか、今どのスキーマに繋いでるの? ってなるとき無いですか? そんなときの確認法。 今、どのサーバーに接続してるんだ? 先日の仮想マシンにOrac …

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

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

ORACLEでCASE文を使用した時にORA-00932のエラーが出る

割と悩んだ・・・ 原因は、CASE文で使用している項目のデータ型が異なるのが原因みたいだけど、正直、ぴんと来てない現実w select case name when ‘A’ then ‘あ’ when …

ORACLEでORA-01861: リテラルが書式文字列と一致しません

ORA-01861: リテラルが書式文字列と一致しません このエラー、ぶっちゃけ、意味が分からないところでもある。 日付の指定時に発生してて、原因が判明するまでに結構回り道をしました。 ネットで検索し …

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

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


カテゴリー