- - PR -
oracleでcase式を書いたら「FROMキーワードが指定の位置に…」エラーとなる
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-14 21:54
いつもお世話になります。
OracleでCASE式を使ってselect文を作成したのですが、 どうしてもエラーとなってしまいます。 あちこちのサイトのcase式を参照したけれど 構文ミスがあるようには見られないのですが・・・。 問題のselect文 select w.shohin_cd shohin_cd, w.kbn kbn, w.kbn_mei kbn_mei, nvl( CASE w.kbn when null then ' ' when '0' then m.コメント1 when '1' then m.コメント2 when '2' then m.コメント3 when '3' then m.コメント4 when '4' then m.コメント5 when '5' then m.コメント6 when '6' then m.コメント7 when '7' then m.コメント8 when '8' then m.コメント9 when '9' then m.コメント10 when '10' then m.コメント11 when '11' then m.コメント12 END, ' ') comment from w_juchu_torikomi w, meismst m where w.shohin_cd = m.コード and m.名称区分 = 6 どなたか添削お願いできませんでしょうか? よろしくお願いいたします。 | ||||||||
|
投稿日時: 2008-07-14 22:05
when '11' then m.コメント12 ELSE ' ' END) comment | ||||||||
|
投稿日時: 2008-07-14 23:20
「, ' ')」はnvlにかかるのでは?
それはともかく、いきなり目的の文を作るのではなく、 最初はシンプルなCASE式を書くべきです。 エラーにならなくなったら、徐々に要件を追加していきます。 「切り分け」って言葉覚えておくと良いですよ。 ところで、CASEを使えるバージョンですよね? | ||||||||
|
投稿日時: 2008-07-15 10:47
単純CASE式がいつのバージョンから使えたのかわかりませんが
PL/SQLの埋め込みSQLで使用できるのは9iからだったっていうのに ハマった記憶があります。 あとマニュアル上では戻り値にNULLは指定できない事になっているようです。 ''はどういう扱いなんでしょう… http://www.shift-the-oracle.com/sql/case-when-expression.html#plsql | ||||||||
|
投稿日時: 2008-07-15 11:06
ん。。。
× END, ' ') comment ○ END, ' ') as "comment" ではないですかね。 違うかな。 [補足] comment は、oracleの予約語です。 よって提示SQLは別名を付けているのではなく comment記述と解釈されているのが原因かと思います。 正しくasを使用して(省略可) ""で囲めば別名と解釈されるはずです。 で、未記入さんも言われていますが、下記部分は評価されません。無意味です。 > when null then ' ' またnvlで囲ってますが・・・ > else ' ' END とすれば、case式だけで事足りると思います。 [ メッセージ編集済み 編集者: くまっち 編集日時 2008-07-15 11:30 ] | ||||||||
|
投稿日時: 2008-07-15 21:16
皆さんありがとうございました。
くまっちさんの指摘の修正で正常に流れました。 そうでしたか、予約語だったとは・・・。 よっしーさんの言うとおり、ここに提示したのはあくまで実現したいことで、 自分でいろいろ検証したときはnvlは当然外して切り分けはしていたのですが、 別名の「comment」を外したような気がしてたんですが・・・。 ちなみに > when null then ' ' は評価されないのですね。 よくVB.netとかだとnullが入ると他のcaseが全く評価されないから 同じように組んでしまいました。 実際に「when null then ' '」を外してみたところ正常に値を取得できました。 それと >またnvlで囲ってますが・・・ >> else ' ' END >とすれば、case式だけで事足りると思います。 についてですが、w.kbnがnullなら別に問題はなくて、 取得された「m.コメント1〜12」の値がNULLだと困るので nvlをつけております。 このselect文でカーソルをまわして set kbn_mei = cur1.comment where current of cursor1; とする必要があり、kbn_meiはnullは許さない項目なのでnvlを入れてます。 一応流れたsqlを置いておきます。 select w.shohin_cd shohin_cd, w.kbn kbn, w.kbn_mei kbn_mei, nvl( CASE w.kbn when '0' then m.コメント1 when '1' then m.コメント2 when '2' then m.コメント3 when '3' then m.コメント4 when '4' then m.コメント5 when '5' then m.コメント6 when '6' then m.コメント7 when '7' then m.コメント8 when '8' then m.コメント9 when '9' then m.コメント10 when '10' then m.コメント11 when '11' then m.コメント12 END, ' ') cmnt --ここを変えました from w_juchu_torikomi w, meismst m where w.shohin_cd = m.コード and m.名称区分 = 6 この皆さんにはいつも助けられていて本当に感謝しております。 今後ともよろしくお願いいたします。 ちなみに環境は11gでした。 | ||||||||
|
投稿日時: 2008-07-17 01:36
ん〜、なんというか色々と勘違いをしている気がする。 オラクルだと、""(空文字)はNULLと同様として、NULLとして扱われる筈、 だから、NVLでNULLを""(空文字)に変換したつもりでも、結果としてNULLが返って来る筈。 あと、
ここの部分も何かの勘違いが混ざっている気がする。 この場合のNULLが入るとって、 select (評価式) の時の(評価式)がNULLの場合って意味で言っていると思うけど、 NULLはどのような演算に対してもNULLを返す挙動(※NULL=NULLはTlueにならない) の為に、評価結果としてどこのケースにも入らないって事で、 リンク先のオラクルの挙動の話は、 when null then だと、比較演算の対象にNULLを取る事が確定するする為、 比較を行う以前にそのCaseは決して処理されないケースと確定する為、 評価しない(評価する意味が無い) と言う話 VB.net等の他の言語と比べて特別な挙動と言う訳でもないです _________________ 質問する前に再確認 必要な情報はチャント揃っている? 出し忘れはしてないかい? | ||||||||
|
投稿日時: 2008-07-17 08:28
何もNVL を使わなくても、
こんな感じでよいように思うのですが。 CASE w.kbn when '0' then m.コメント1 when '1' then m.コメント2 when '2' then m.コメント3 when '3' then m.コメント4 when '4' then m.コメント5 when '5' then m.コメント6 when '6' then m.コメント7 when '7' then m.コメント8 when '8' then m.コメント9 when '9' then m.コメント10 when '10' then m.コメント11 when '11' then m.コメント12 when NULL then ' '
私もそういう風に見えましたが、' 'は空文字ではなくて1個分の半角スペースが入っているようですね。 |