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

このQ&Aのポイント
  • SQL文のOrder by句で2つのバインド変数を用いて、ソートする項目・ソート順を決める方法について説明します。
  • バインド変数を直接Order by句に入れると、バインド変数の値が無視されてデータが出力されないことがあります。
  • バインド変数の値を参照するために、Case文を使用してソートする項目と順番を決めることができます。Oracleのバージョンは11gです。
回答を見る
  • ベストアンサー

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です。 ご回答よろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数14

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.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 .... とでもするしかないと思います。 ※未検証。

kagura0258
質問者

お礼

ご回答ありがとうございます。 返信が遅くなり、申し訳ございません。 ご回答していただきました方法でSQL文を再構築いたしましたが、DESC・ASCを入れると、”右かっこがありません"のエラーメッセージが発生して、SQL文が実行できませんでした… 試しにDESC・ASCを外して実行するとSQL文が発行し、:ITEMで指定した項目でソートできました。 やはりバインド変数でDESC・ASCを決定するのは無理なのかもしれません…

kagura0258
質問者

補足

先ほどのお礼でエラーが発生すると書きましたが、かっこの位置が間違えたまま実行しておりまして、エラーが発生しておりました。 大変申し訳ありません。 かっこの位置を正しいものに修正し、再度実行したところ、目的としているソートができるようになりました。 ご回答、ありがとうございました。

関連するQ&A

  • PL/SQLにて、マスタから取得した値をORDER BY句に指定したい

    どなたかお判りになる方、ご教示ください。 ★やりたいこと PL/SQLにて、マスタから取得した値をORDER BY句に指定したい。 (例)以下のようなマスタがあるとします。 -------------------------- ソートマスタ SORT_MST ソート順 SORT_ORDER ソート項目 SORT_ITEM ソート種別 SORT_SBT -------------------------- この「ソートマスタ」の「ソート項目」には、以下のトランザクションテーブルの物理カラム名が格納されています。 -------------------------- トラン TRN 商品種別 ITM_SBT 商品コードITEM_COD 商品名 ITEM_NM 金額  ITM_AMN -------------------------- PL/SQLにて「ソートマスタ」から値取得後、「ITEM_COD ASC,ITM_AMN ASC」という文字列を作成し、「トラン」検索時にORDER BY句に指定したのですが、ORDER BY句が全く効いてくれません。 お忙しいところ恐れ入りますが、ご存知の方、よろしくお願い致します。

  • ASで指定した項目名をGROUP BYやORDER BYで使用する方法。

    ただいまSQLの勉強をしています。 タイトルどおりなのですが、ASで指定した項目名をGROUP BYやORDER BYで使用する方法はあるのでしょうか? CASE文を使用したこちらのSQL文↓で、SELECT文、GROUP BY句、ORDER BY句の中に重複する部分が多く出てしまうのでどうにかすっきりさせたいと思い、独自に調べたり色々と試したのですがわからず、質問させていただきました。 お分かりになる方、いらっしゃいましたらご助言どうぞよろしくお願いいたします。 <SQL文> SELECT CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END AS グループ名称 , sum(suryo) AS 数量合計 FROM tran GROUP BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END ORDER BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END;

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • order by asc,desc混合index

    order by で asc ,desc混合する場合indexが使用できないと思いますが、 たとえば、col1,col2,col3があったとして order by col1 asc, col2 desc, col3 asc ➡ order by col1 asc ,99999999 - col2 asc , col3 asc などのように、 col2を、カラムが取りうる最大値から引いてやることでascに置き換えても indexはかからないでしょうか?

    • ベストアンサー
    • MySQL
  • order by での変数使用について。

    order by での変数使用について。 PHPのsql文でDBからデータを抽出する際にorder byで特定のデータに対して昇順、降順でデータを抽出したいのですが、ここで変数を使うとorder byが上手く機能しません。 変数でなく、直接カラム名を記入すれば動くのですが・・・。 一つ疑問に思ったことはorder byで変数が使えるかというところです。 where等の条件検索では問題なく使えるので使えないということはないのかなぁと思って 試行錯誤していましたが、どうにもこうにも上手くいきません。 また変数にした理由ですが、今回情報を検索する機能を作成しています。 データの数が多いため、次のページなど何ページかに分けて表示しようと思っています。 そのため特定の値(検索条件)をセッションに保存し、次のページなどに移動しても値を保持して 同じ条件で続きからデータを抽出したいのです。 sql文は $sql = 'SELECT * FROM `apartment` left join `member` on a_member = m_id left join `district` on a_district = d_id left join `room` on a_room = r_id WHERE `a_flg` = "0" AND `a_district` = "'.$_SESSION["district"].'" order by "'.$_SESSION["condition"].'"'; このようになっています。 セッションに値は入っていて、出力するとちゃんとカラム名(検索条件)が表示されます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ORDER BY句の指定

    MySQL 4.0.26 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2273403 の続きになります。 ORDER BY句をつけて、人口密度でソートしたいときは、 SELECT 人口,面積,人口/面積 AS 密度 FROM MYTABLE WHERE 人口/面積 >20 ORDER BY ??? この???には、人口/面積が正解でしょうか?

    • ベストアンサー
    • MySQL
  • バインド変数について

    PL/SQLのバインド変数について調べていますが理解できず困っています。 [理解内容] 1.利点  :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる   ⇒ 繰り返し処理(ループ)では有効 2.使用方法  :静的SQL・動的SQLで使用可能   [疑問点]   静的SQLではバインド変数をどう宣言すればよいですか?   [SQL*Plus]・[動的SQL]は例文がありました   ●SQL*Plusでの宣言方法    (例)     SQL> set null '<null>'     SQL> set head off     SQL> variable var_at_sqlplus number   ●動的SQLの記述方法    (例)     declare      v_sql varchar2(256);      v_id varchar2(3);     begin      v_sql = 'select id into :v_id from test';      execute immediate v_sql into v_id;     end;   ●静的SQL ・・・【 エラーになる 】     declare      variable v_id varchar2(3);     begin      select id into :v_id from test'     end; どんな事でもかまいませんので回答よろしくお願いします

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • T-SQL: Order By の使い方

    (別のCategoryに載せてしまいましたがみつかりませんので、正しいCategoryで再掲載しています。) T-SQL: Order By の使い方について (初心者です) 下のような順番で結果を求めています。 Item NO QTY P001    10 P002      8 P003    20 N001    13 N002    50 Q001    5 Q002    33 Q003     6 Table内のItemNOはA001から alphabetと3桁番号の順番でY005まであるものとして、上記のP,N,QのItemNoのものだけをこの順番で求めたいのです。 もちろん、WHERE-clauseにはこの8件のItemNOの指定はしてあります。 Order by left(ItemNO, 1) DESC (またはASCE), substring(ItemNo, 2,4) ASC これでは、P,N,Qの順番にはなりません。 最初にP Number、次にN Number、最後にQ Numberを出すにはどうしたらいいのでしょうか。 Order Byの次に8個のItemNOを上記の順番に書いて指定することはできるのでしょうか。 Order Byには "Case When" が使えるとあるinternetで見たのですが、もし使えるとしたらこの順番をだすのに使えるのでしょうか。 ご指導お願いいたします。