- PR -

oracleでcase式を書いたら「FROMキーワードが指定の位置に…」エラーとなる

投稿者投稿内容
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 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

どなたか添削お願いできませんでしょうか?
よろしくお願いいたします。
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2008-07-14 22:05
引用:

when '11' then m.コメント12
END, ' ') comment



when '11' then m.コメント12
ELSE ' '
END) comment
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-07-14 23:20
「, ' ')」はnvlにかかるのでは?

それはともかく、いきなり目的の文を作るのではなく、
最初はシンプルなCASE式を書くべきです。
エラーにならなくなったら、徐々に要件を追加していきます。
「切り分け」って言葉覚えておくと良いですよ。

ところで、CASEを使えるバージョンですよね?
未記入
会議室デビュー日: 2006/03/22
投稿数: 19
投稿日時: 2008-07-15 10:47
単純CASE式がいつのバージョンから使えたのかわかりませんが
PL/SQLの埋め込みSQLで使用できるのは9iからだったっていうのに
ハマった記憶があります。
あとマニュアル上では戻り値にNULLは指定できない事になっているようです。
''はどういう扱いなんでしょう…

http://www.shift-the-oracle.com/sql/case-when-expression.html#plsql
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 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 ]
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 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でした。
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2008-07-17 01:36
引用:

コウジさんの書き込み (2008-07-15 21:16) より:

取得された「m.コメント1〜12」の値がNULLだと困るので
nvlをつけております。

このselect文でカーソルをまわして
set kbn_mei = cur1.comment
where current of cursor1;
とする必要があり、kbn_meiはnullは許さない項目なのでnvlを入れてます。




ん〜、なんというか色々と勘違いをしている気がする。
オラクルだと、""(空文字)はNULLと同様として、NULLとして扱われる筈、
だから、NVLでNULLを""(空文字)に変換したつもりでも、結果としてNULLが返って来る筈。

あと、

引用:


よくVB.netとかだとnullが入ると他のcaseが全く評価されないから




ここの部分も何かの勘違いが混ざっている気がする。
この場合のNULLが入るとって、
select (評価式)
の時の(評価式)がNULLの場合って意味で言っていると思うけど、
NULLはどのような演算に対してもNULLを返す挙動(※NULL=NULLはTlueにならない)
の為に、評価結果としてどこのケースにも入らないって事で、

リンク先のオラクルの挙動の話は、
when null then
だと、比較演算の対象にNULLを取る事が確定するする為、
比較を行う以前にそのCaseは決して処理されないケースと確定する為、
評価しない(評価する意味が無い)
と言う話

VB.net等の他の言語と比べて特別な挙動と言う訳でもないです
_________________
質問する前に再確認
必要な情報はチャント揃っている?
出し忘れはしてないかい?
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 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 ' '

引用:

ん〜、なんというか色々と勘違いをしている気がする。
オラクルだと、""(空文字)はNULLと同様として、NULLとして扱われる筈、
だから、NVLでNULLを""(空文字)に変換したつもりでも、結果としてNULLが返って来る筈。



私もそういう風に見えましたが、' 'は空文字ではなくて1個分の半角スペースが入っているようですね。

スキルアップ/キャリアアップ(JOB@IT)