- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Order by句でバインド変数を使うには?)
Order by句でバインド変数を使うには?
このQ&Aのポイント
- SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決める方法について説明します。
- バインド変数を直接Order by句に入れると、バインド変数の値が無視されてデータが出力されないことがあります。
- バインド変数の値を参照するために、Case文を使用してソートする項目と順番を決めることができます。Oracleのバージョンは11gです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
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 .... とでもするしかないと思います。 ※未検証。
お礼
ご回答ありがとうございます。 返信が遅くなり、申し訳ございません。 ご回答していただきました方法でSQL文を再構築いたしましたが、DESC・ASCを入れると、”右かっこがありません"のエラーメッセージが発生して、SQL文が実行できませんでした… 試しにDESC・ASCを外して実行するとSQL文が発行し、:ITEMで指定した項目でソートできました。 やはりバインド変数でDESC・ASCを決定するのは無理なのかもしれません…
補足
先ほどのお礼でエラーが発生すると書きましたが、かっこの位置が間違えたまま実行しておりまして、エラーが発生しておりました。 大変申し訳ありません。 かっこの位置を正しいものに修正し、再度実行したところ、目的としているソートができるようになりました。 ご回答、ありがとうございました。