• ベストアンサー

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

  • oo4o接続でのNVL関数について

    度々、同じような質問をしてしまいますが、 ご存知の方がいらっしゃいましたら、 ご教授願います。 現在、以下の環境で開発を行っています。 OS:Windows2000Professional 言語:VB6sp6 サーバ:Oracle8i 接続方法:oo4o 8.1.7.3.15(パッチあて済み) NVL関数にて、数字属性の項目を、 Null値なら、ZEROに置き換えるようSQLを発行しているのですが、 プログラムで計算に使おうとすると、 Null値が入ったままで落ちてしまいます。 実際プログラムで編集しているSQLを、 SQLPLUSで発行してみると正しく動作しているのですが。。 ”oo4o接続だと、NVL関数が正しく使えない” というような情報ってありますか? 正しく使う方法はありますか?

  • 関数の実行について

    AccessからSQL Server2005へ作り変えています。 質問させていただきます。 テーブル名「伝票」の中身    製品  在庫数  注文数       A    12     10         B    11     13         C    16     11     このテーブルから在庫数と注文数を比較して、 注文数が在庫数以内の場合は・・・OK 注文数が在庫数以上の場合は・・・NG イメージとしては以下のようにななります。    製品  在庫数  注文数  判定     A    12     10    OK     B    11     13    NG     C    16     11    OK これをAccessのクエリで表現する場合は、判定にVBAを使っています。 (テーブルに判定という項目はありません) SQL Server2005ではスカラ値関数を作って、それをストアドプロシージャで 呼び出せば可能ですよね・・・? そこで以下の悪戦苦闘しながら以下のスカラ値関数を作りました。    ALTER FUNCTION dbo.HANTEI (@ZAIKO int, @TYUMON int, @HANTEI nvarchar(2)) RETURNS nvarchar(2) AS BEGIN IF @ZAIKO >= @TYUMON SET @HANTEI = 'OK' ELSE SET @HANTEI = 'NG' RETURN @HANTEI END これをストアドプロシージャで実行すると、パラメータで指定したHANTEI がテーブルにないので エラーになります。テーブルに判定に相当する項目を用意すると正しく結果が出ます。 テーブルに判定項目を用意せずに正しい結果を出したいのですがどうすればよいですか? よろしくお願いします。

  • SELECT文でLEFT関数を使うと未定義関数ですと言われる

    VBソース上では SELECT LEFT(~~~,4) AS 項目 FROM テーブル と SELECT文で書いてもエラーにならずオープンできるみたいなのですが そのSQL文をACCESS2000上で動かすと 未定義関数LEFTがあると言われます どなたか分かる方至急お願いします!!!

  • 「何々でなければ、この値」というような関数

    「何々でなければ、この値」というような関数を探しています。 こんな感じです。 func(ZZZ, 'A', 'P') ZZZが'A'でなければ'P'を返す イメージ select ZZZ z, func(ZZZ, 'A', 'P')  f from テーブル; z     f -   - A    A NULL P P    P B    P なお、一つの関数である必要はなく、関数を組み合わせたり、入れ子にしたりするのはかまいません。 もしかすると、次のようにするとできるかもしれません。 NVL2 ( NULLIF('A', ZZZ), 'P', 'A' ) ただ、わかりにくい感じがするので。

  • NULLか空文字かの判別(DBの値)

    VB.NETで、Access(mdb)のテーブルから DAOでデータ取得し、取得したレコード毎に値のチェック処理をします。 その値がNULLかどうかは、isDBNULL関数を使用すれば判定できますが、 空文字についてはどう判定すればわかりますでしょうか?? String型にキャストして「= ""」で判定しようとしましたが、 空文字の場合だとString型にキャストする際にエラーが発生します。 家で試せる環境にないので、エラーが出るかどうかわからないのですが String.IsNULLOrEmptyで判定できるのでしょうか? これもString型にキャストする必要がありそうなので、エラーが出るようにも思います・・・。 オブジェクト型の値が空文字かどうか判定する方法を教えていただけないでしょうか。

  • SQLのIN関数に関して

    調べても見つからずすいませんが質問させてください。 SQLのIN関数にてNULLは使用できないのでしょうか? 例:項目 IN (NULL,'') といった具合にしても無理でしょうか? Vb.net 2005 SQLServer 2005 を使用しています。

  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? VB.net2005を使っているのですが 関数の引数に変数をセットして、別関数で 引数に対してデータをセットすることは可能でしょうか? C言語でいうところのポインタを引数に渡し ポインタアドレスに書き込むような処理はVB.netでは 可能なんでしょうか? 下記のような事は試したのですが、うまく出来ませんでした(。。; public sub test1() dim mojiretu as string test2( mojiretu ) msgbox(mojiretu) end sub public sub test2( str as string) str = "文字列" end sub

  • VB6.0のIsNull関数に相当するもの

    VBを10年近く使っていて、最近VB.NETの勉強を始めました。 お聞きしたいのですが、Access等のデータベースからデータを取得し、 そのレコードの項目の内容がNullかどうかを確認したいのですが、 どうすればよいでしょうか? VB6.0までならIsNull関数を使用していたのですが・・・どうにも調べ切れませんでした。 よろしくお願いします。

  • エクセルのTEXT関数について

    Cellシート上でTEXT( )関数を使うと  ちゃんと使えますが、 VBで標準関数の中で  新しい関数を作って、その中に  an=Text(suu,"00#") などと、TEXT関数を記述すると 関数が定義されていません。、とエラーになります このTEXTという関数はエクセルのセル上でしか、使えない のでしょうか?

このQ&Aのポイント
  • 文字の縦横比を維持したまま、左揃えはできない
  • position relativeやposition absoluteを使えば左揃えは可能だが、個別に対応が必要
  • 解決策がわからず、困っている
回答を見る