こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Order by句でバインド変数を使うには?

SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決めたいと思い、以下のようなSQLを作成いたしました。

Select row_Number() Over(Order by
Case :ITEM
When 'PJコード' then PJコード
When '部署コード' then 部署コード
end
Case :LINE
When '1' then DESC
When '2' then ASC
end ....

バインド変数を直接Order by句に入れますと、結果は帰ってくるのですが、バインド変数の値がすべて無視されてデータが出力されます。
以上の理由より、Case文にてバインド変数の値を参照し、ソートする項目と順番を決めております。
上記のソースで実行しますとORA-00907:右かっこがありませんというエラーが表示されます。

2つ目のCase文(:LINE)を消し、最初のCase文だけを残して、並び順(DESC・ASC)を埋め込むと、実行される状態になります。

Oracleのバージョンは11gです。
ご回答よろしくお願いいたします。

投稿日時 - 2013-09-20 17:28:27

QNo.8272445

すぐに回答ほしいです

質問者が選んだベストアンサー

Order by 項目名 asc/desc
で、項目名に case文は、使えるけど、
asc/desc にcase文は使えません。
(1つ目のCase文は項目名を指定しているのと同じで、1レコードずつ処理されて同じCase文の結果を
1レコードづつ返していると思うけど、内部処理の話なのではっきりしたことはわかりません。)

>2つ目のCase文(:LINE)を消し、最初のCase文だけを残して、並び順(DESC・ASC)を埋め込むと、
>実行される状態になります。
では、デフォルトのascが適用されて実行できている。

じゃあどうすれば実現できるのかといわれると、
SQLを発行している元の処理が何かわからないので最善かどうかはわかりませんが、
SQLで実行するなら、

Select case :LINE when '1' then
(row_Number() Over(Order by
Case :ITEM
When 'PJコード' then PJコード
When '部署コード' then 部署コード
end
desc)
when '2'
(row_Number() Over(Order by
Case :ITEM
When 'PJコード' then PJコード
When '部署コード' then 部署コード
end
asc)
end
....
とでもするしかないと思います。

※未検証。

投稿日時 - 2013-09-21 11:57:35

補足

先ほどのお礼でエラーが発生すると書きましたが、かっこの位置が間違えたまま実行しておりまして、エラーが発生しておりました。
大変申し訳ありません。

かっこの位置を正しいものに修正し、再度実行したところ、目的としているソートができるようになりました。

ご回答、ありがとうございました。

投稿日時 - 2013-09-24 10:28:46

お礼

ご回答ありがとうございます。
返信が遅くなり、申し訳ございません。

ご回答していただきました方法でSQL文を再構築いたしましたが、DESC・ASCを入れると、”右かっこがありません"のエラーメッセージが発生して、SQL文が実行できませんでした…

試しにDESC・ASCを外して実行するとSQL文が発行し、:ITEMで指定した項目でソートできました。

やはりバインド変数でDESC・ASCを決定するのは無理なのかもしれません…

投稿日時 - 2013-09-24 10:23:12

このQ&Aは役に立ちましたか?

13人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問