• ベストアンサー

NVL関数について

現在、以下の環境で開発を行っているのですが、 いくら調べても埒があかないので、 こちらで質問させていただくことにしました。 OS:Windows2000Professional 言語:VB6sp6 サーバ:Oracle8i 接続方法:oo4o 8.1.7.3.15(パッチあて済み) テーブルより、ある値(TAB_FLG、とします)をとってきて、 その値が☆ならOK、そうでなければNG、のようなコーディングです。 TAB_FLGにNULLが入っていることを考慮して、 NVL関数を使用したSELECT文を発行したのですが、 どうも、 その先の判定でエラーになってしまうのです。 具体的な記述は以下の通りです。 strSQL = "select nvl(TAB_FLG,'☆') from ~" . . . If OraDynaset.Fields("TAB_FLG") = "☆" then Msgbox "OK" Else Msgbox "NG" End If ※テーブルの項目数が多いことと、  必ずレコードが1件しかヒットしないので、  OraDynasetを直接判定に使用しています。 エラーの内容は、(VBのErrorから拾うと) 「OIP-04099:フィールド'TAB_FLG'は見つかりません。」 です。 NULLを無視して、NVL関数を使用しないSQLを発行すると、 このエラーは出ません。 あと、 NVL関数を記述する際に、 「NVL(TAB_FLG,'☆') as TAB_FLG」 という方法をとると、このエラーは出ません。 まったく原因がわからず困っています。 できれば、 使用するテーブルの項目数が多いので、 後者の「as」記述はしたくないのですが・・・ というか、 「as」記述は任意であったと思うので、 なくてもうまくいくはずなのですが・・・ OracleのPDFのマニュアル等にも、 ネットでいくら検索かけても、 解決策がありません。 (どころか、どこにもNVL関数の「as」記述について一切触れられていない) ご存知の方、いらっしゃいましたら、 ご教授願います。 大変困っています。

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

  • ベストアンサー
  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.1

NVL(TAB_FLG,'☆') とSQLに記述した時点で、列名はTAB_FLGでなく、NVL(TAB_FLG)になりますので、 OraDynaset.Fields("TAB_FLG")で列名無効のエラーになるのは至極当然の事です。 こういう場合は、お察しの通りasで別名を付与してやるのが定石です。他にもSUM関数等でも同じ事です。 OraDynaset.Fields("NVL(TAB_FLG)") とやっても、もしかしたらうまくいくかもしれません。 この辺はDBドライバの処理系に依存するので、一慨にOKと言えないのですが。そういう問題の解決法としてas句が用意されています。

tink123
質問者

お礼

回答ありがとうございます。 こちらでも少し検討した結果、 NVL関数をつけたらやはり、 「as」で名前をつけてあげないといけないのですね。 もっと早く気づきたかったです。。 というか、いくら調べても全然出てこなかったので、 本当に困りました。。 これから頑張って、「as」記述することにします・・・ ありがとうございました。

その他の回答 (1)

  • lovesens
  • ベストアンサー率30% (48/158)
回答No.2

今、自宅からなので実機での確認ができないのですが >If OraDynaset.Fields("TAB_FLG") = "☆" then こういう記述をするなら、関数を使った項目は別名定義しないと「OIP-04099:フィールド'TAB_FLG'は見つかりません。」というエラーが返ってきたと思いますよ。 これはNVLに関わらず、SUM,MAX,MIN等の関数もそうだったと思います。 >「NVL(TAB_FLG,'☆') as TAB_FLG」 as句を除いた記述もできますが、意味するところは同じです。 例:select sum(money) sum_money from money_tbl; sum_moneyはsum(money)の別名です。 別名記述がどうしても嫌であれば、「If OraDynaset.Fields(0) = "☆" then」という記述ができます。 その場合、SELECT句にある1番目の項目はFields(0)、2番目の項目はFields(1)で取るようにしてください。 最後に「Fields()」じゃなくて「Fields().value」の記述の方がいいようですよ。 実例は忘れてしまったのですが、「.value」がなかったために望む値が取れなくてエラーの原因になったことがありました。以来、うちの会社では「.value」で取ってくるよう厳命されてます。

tink123
質問者

お礼

回答ありがとうございます。 すでに解決してしまったので、 先着順で良回答を選ばせていただきました。 が、とても勉強になったので、 「役にたった」と投票させていただきました。 テーブルの項目数が多いので、 今後、SQLに修正が入ることを考慮すると、 インデックスを使用することは避けました。 「.value」をつけるとよいのですね。 とても勉強になりました。 「as」記述のついでに、つけるか。。 う~。。 本当にありがとうございました。

関連するQ&A