- ベストアンサー
SELECT文内での条件分岐
すみませんが、ご指導お願いします。 ACCESS97+ORACLEを用いまして、データベースを操作するのを作成しています。 うまくいかなく立ち止まってしまいました。 パススルークエリを使用し、SELECT文内部の1項目内にcase文を使用して、値をだしたいのですが。 内容ですが: 条件項目のところ: (1)販売数が0のものは0とし (2)日当数/在庫数が1以下のものは、1とし (3)それ以外は、(日当数/在庫数)+0.9 上記の各それぞれでだされた値に「在庫数」をかける。 SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 0 ELSE (日当数/在庫数) < 1 THEN 1 ELSE (日当数/在庫数)+0.9 END) END) * 在庫数 select文自体がcase文はできないのか、もし可能でしたら、自分の構文が何が悪いのか、ご指導お願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Oracle8.0.xでは、case文は使えません。 Oracle8.1.xで、拡張された機能です。 古いオラクルでは、case文でなく、decode関数で 勝負します。 select 商品コード, 在庫数, 販売数, 販売数 / 稼働日 as 日当数, decode(販売数,0, decode(sign(販売数 / 稼働日 / 在庫数) - 1,-1,1, 販売数 / 稼働日 / 在庫数 + 0.9)) * 0.9 from hoge ;
その他の回答 (3)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>構文を確認してやってみました。 >確認後、CASE文のところに()を通常つけるのでしょうか? サブクエリと違うので、()は不要です。 最初に書きましたが、Oracleのバージョンによって、 case文の取り扱いに差があります。 バージョンは何ですか? FROMが無いといわれるのは、Oracleのバージョンの問題か コーディングミス(カンマの過不足)のいずれかの可能性が 高いです。
補足
ご回答ありがとうございます。 ORACLEのバージョンですが、「Oracle 8 -Release 8.0.5.2.1-」になります。 現在、コーディング確認しておりますが、誤っているところはなさそうです。 お手数おかけしますが、お願い致します。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
Oracle9iであれば、case文の使用に制限がありませんが、 8iでは、一部使えない場合があるので要注意です。 (ストアドでは使えない等) 基本的にCASE文の構文がおかしいと思いますが.. select 商品コード, 在庫数, 販売数, 販売数 / 稼働日 as 日当数, case when 販売数=0 then 0 when (販売数 / 稼働日 / 在庫数) < 1 then 1 else 販売数 / 稼働日 / 在庫数 + 0.9 end * 0.9 from hoge ; ような感じになると思います。
補足
すみません。ありがとうございます。 構文を確認してやってみました。 確認後、CASE文のところに()を通常つけるのでしょうか? SELECT 商品コード,~..... (CASE WHEN (A.最新当月販売予測数=0) THEN 0 WHEN (日当数/B.収容数) < 1 THEN 1 ELSE (日当数/B.収容数+0.9999) END * 0.9) カッコをつけないと「FROM句が指定の位置にありません」のメッセージが出てしまいます。 つけると、「右カッコがありません」メッセージがでてどちらでも動作してくれません。何かほかの要因があるのでしょうか?
現状では、CASE文のネストの仕方がとりあえず違っているようです。 まず、 (CASE WHEN 販売数=0 THEN 0 ELSE・・・ のELSE以後で、もう一回CASEでやれば良いと思います。要するに、(1)の条件が満たなかったら、(2)と(3)の条件をもう一回、CASEで聞いてやる感じでしょうか。 Endなどの対応関係はお間違いなく・・・。
補足
考えなおしてみました。 実際ネスト無しでやってみたのですが、エラーが出てしまいます・・・。 例文で、 SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 1 ELSE 2 END) AS 判定 でやっても「右カッコがありません」メッセージがでてしまうのですが、何が悪いのでしょう? >Endなどの対応関係はお間違いなく・・・。 ネスト内部でもEnd句は必要なのですか? 考えなおしてみましたが・・。 ************************************************* SELECT 商品コード,在庫数,販売数,販売数/稼動日 AS 日当数,(CASE WHEN 販売数=0 THEN 0 ELSE (CASE WHEN日当数/在庫数) < 1 THEN 1 ELSE (日当数/在庫数)+0.9) END)END) * 在庫数 ************************************************** 重ね重ねお願い致します。
お礼
ご回答ありがとうございます。 おかげさまで目的が果たせました。 今回はOracleについてもとても勉強になりました。 また、機会があればお願い致します。