質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

13670閲覧

カーソル内のORDER BYで条件分岐を行いたい

Iwakichi

総合スコア7

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/02/05 07:30

前提・実現したいこと

カーソル内でORDER BYについて条件分岐をしようと思っていまして、
カーソルの条件にソート条件を持たせてそれを読み込む形に実装してみたのですが、
下記のような書き方だとソートが上手く行かず。。
デフォルト(指定なし)の状態でデータが返ってきてしまいます。
この方法での分岐は不可能なのでしょうか・・・?
また、他に良い方法など有りましたらご教授お願い致します。

発生している問題・エラーメッセージ

PL/SQL

~ CURSOR C_CUSTOMER(SORT_JOKEN IN NVARCHAR2) IS SELECT A.* FROM A, B WHERE A.KEY = B.KEY ORDER BY SORT_JOKEN ~ sortJoken NVARCHAR2(50) := ''; IF sortKbn = 20 THEN sortJoken = 'B.SUB_KEY DESC' ELSE sortJoken = 'B.SUB_KEY, A.SUB_KEY DESC' END IF; FOR C_CUSTOMER IN C_CUSTOMER(sortJoken) LOOP ~常にソート指定なしの結果~ END LOOP; ~

試したこと

ObjectBrowserでカーソル部分のSQLを直接実行し、
ORDER BY部分をバインド変数にして、
上記のIF文で分けている箇所をバインド変数に入れて試してみましたが、
指定なしで返ってくることを確認。

補足情報(FW/ツールのバージョンなど)

動作環境:Oracle Database 11g R2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Row_Number関数を使ってみました :-)

sql

1SELECT A.* 2 FROM A, B 3WHERE A.KEY = B.KEY 4ORDER BY 5decode(sortKbn,20, 6Row_Number() over(order by SUB_KEY DESC) 7Row_Number() over(order by B.SUB_KEY,A.SUB_KEY DESC))

投稿2018/02/05 08:48

AketiJyuuzou

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Iwakichi

2018/02/05 08:56

ほうほう、Row_Number()関数というものが・・・ 可読性についてはこちらの方が良さげなのですが、 saziさんのcase文を用いた分が馴染みありますので、 そちらを使用したいと思います。 こちらの回答もこちらで勉強になりました! ご回答ありがとうございました。
sazi

2018/02/05 09:07 編集

>AketiJyuuzou さん order by した上にorder byなので、row_number()使用しない記述より低速になるのではないかと思うのですが、こちらの方が高速ですか?
sazi

2018/02/05 09:19

後、order by にrow_number()って書けましたっけ?
guest

0

ベストアンサー

提示のSQLだと単にORDER BY '文字列'にしかなりませんから、ソートは掛かりませんね。

以下ではどうですか。

SQL

1CURSOR C_CUSTOMER(sortKbn IN NVARCHAR2) IS 2 SELECT A.* 3 FROM A, B 4 WHERE A.KEY = B.KEY 5 ORDER BY B.SUB_KEY desc 6 , case when sortKbn!='20' then A.SUB_KEY end desc

追記

条件によって、B.SUB_KEYの昇順/降順が切り替わるのを見落としていました。

SQL

1CURSOR C_CUSTOMER(sortKbn IN NVARCHAR2) IS 2 SELECT A.* 3 FROM A, B 4 WHERE A.KEY = B.KEY 5 ORDER BY case when sortKbn='20' then B.SUB_KEY end desc 6 , case when sortKbn!='20' then B.SUB_KEY end 7 , case when sortKbn!='20' then A.SUB_KEY end desc

投稿2018/02/05 07:46

編集2018/02/05 08:06
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Iwakichi

2018/02/05 08:13

なるほど、CASEで条件を追加していくという発想ですね! 変数突っ込んでこれで行く!という考えから抜け出せなかったです。。 早速、改修先のPGに組み込んで目的の振る舞いをすることができました。 素早いご回答ありがとうございました。助かりました。
guest

0

動的SQLでカーソルを使用 を参考に

PL/SQL

1途中から 2 IF sortKbn = 20 THEN 3 OPEN C_CUSTOMER FOR ... ORDER BY B.SUB_KEY DESC ; 4 ELSE 5 OPEN C_CUSTOMER FOR ... ORDER BY B.SUB_KEY, A.SUB_KEY DESC ; 6 END IF; 7以下略

投稿2018/02/05 07:45

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Iwakichi

2018/02/05 08:16

saziさんの方法が改修先に組込やすそうだったので、 そちらをベストアンサーとさせていただきました。 Orlofskyさんも素早いご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問