[リストへもどる]
一括表示

投稿時間:2003/07/30(Wed) 18:06
投稿者名:みつお
Eメール:
URL :
タイトル:
データベースの値との比較について
お世話になります。また教えていただきたいことがあり
書き込ませていただきました。

VB6とORACLE8i(oo4oにて接続)を使って開発を行っているのですが、
その中で、VBのテキストに入力されたデータとデータベースの値を
比較して、同じものがあればその数を返すというものです。

sql="SELECT COUNT(*) FROM TABLE1" _
  & "WHERE TABLE1.DATA1 = '" & VB.Text & "'"

SQL文ではこういう風に記述しています。
ちなみにTABLE1.DATA1は文字型(VARCHAR2)です。

ところが、この比較している値両方共にNULL値が入る場合があり、
困っています。
SQLの関数でNVLというNULLの時に違う文字を入れる関数がある
みたいなのですが、空文字("")には変換できないみたいです。

どなたか、良い方法があれば教えていただけないでしょうか?
よろしくお願いいたします。

投稿時間:2003/07/30(Wed) 19:05
投稿者名:だい
Eメール:dee_bassist@hotmail.com
URL :
タイトル:
Re: データベースの値との比較について
>sql="SELECT COUNT(*) FROM TABLE1" _
>  & "WHERE TABLE1.DATA1 = '" & VB.Text & "'"

先にVB.TextがNULL(もしくは空値)かどうかを判定し、
その場合は、
SELECT COUNT(*) FROM TABLE1
WHERE TABLE1.DATA1 IS NULL
を発行すればよろしいかと思われます。

投稿時間:2003/07/30(Wed) 19:48
投稿者名:みつお
Eメール:
URL :
タイトル:
Re: データベースの値との比較について
> >sql="SELECT COUNT(*) FROM TABLE1" _
> >  & "WHERE TABLE1.DATA1 = '" & VB.Text & "'"
>
> 先にVB.TextがNULL(もしくは空値)かどうかを判定し、
> その場合は、
> SELECT COUNT(*) FROM TABLE1
> WHERE TABLE1.DATA1 IS NULL
> を発行すればよろしいかと思われます。

だいさん、ありがとうございます。
そういう手がありましたね。
しかし、実際の処理は値の比較が50ほどありまして、
教えていただいた方法ですと、かなりのコーディング量になってしまいます。
やはりSQL文だけで対処するのは無理なのでしょうか?
なければ教えていただいた方法で行こうと思っております。

投稿時間:2003/07/31(Thu) 10:33
投稿者名:TM
Eメール:
URL :
タイトル:
Re^2: データベースの値との比較について
> > >sql="SELECT COUNT(*) FROM TABLE1" _
> > >  & "WHERE TABLE1.DATA1 = '" & VB.Text & "'"
> >
> > 先にVB.TextがNULL(もしくは空値)かどうかを判定し、
> > その場合は、
> > SELECT COUNT(*) FROM TABLE1
> > WHERE TABLE1.DATA1 IS NULL
> > を発行すればよろしいかと思われます。
>
> だいさん、ありがとうございます。
> そういう手がありましたね。
> しかし、実際の処理は値の比較が50ほどありまして、
> 教えていただいた方法ですと、かなりのコーディング量になってしまいます。
> やはりSQL文だけで対処するのは無理なのでしょうか?
> なければ教えていただいた方法で行こうと思っております。

これって、VB.TextがNULLだったら"TABLE1.DATA1 IS NULL"、
そうでなかったら"TABLE1.DATA1 = '" & VB.Text & "'"
としたいってことですよね。
("TABLE1.DATA1 IS '" & VB.Text & "'"ではダメだし)
そうだとしたら、SQL文というよりも文字列の操作だと思います。

sql="SELECT COUNT(*) FROM TABLE1 WHERE TABLE1.DATA1 " _
  & IIf(IsNull(VB.Text), "IS NULL", "= '" & VB.Text & "'")
とかするしかないのでは。
IIfはIf文の省略形?なので、だいさんのいうように
sql="SELECT COUNT(*) FROM TABLE1 WHERE TABLE1.DATA1 "
If IsNull(VB.Text) Then
  sql = sql & "IS NULL"
Else
  sql = sql & "= '" & VB.Text & "'"
End If
とするのとコーディング量は大して変わらないかも知れませんが。

投稿時間:2003/07/31(Thu) 11:11
投稿者名:みつお
Eメール:
URL :
タイトル:
Re^3: データベースの値との比較について
>
> これって、VB.TextがNULLだったら"TABLE1.DATA1 IS NULL"、
> そうでなかったら"TABLE1.DATA1 = '" & VB.Text & "'"
> としたいってことですよね。
> ("TABLE1.DATA1 IS '" & VB.Text & "'"ではダメだし)
> そうだとしたら、SQL文というよりも文字列の操作だと思います。
>
> sql="SELECT COUNT(*) FROM TABLE1 WHERE TABLE1.DATA1 " _
>   & IIf(IsNull(VB.Text), "IS NULL", "= '" & VB.Text & "'")
> とかするしかないのでは。
> IIfはIf文の省略形?なので、だいさんのいうように
> sql="SELECT COUNT(*) FROM TABLE1 WHERE TABLE1.DATA1 "
> If IsNull(VB.Text) Then
>   sql = sql & "IS NULL"
> Else
>   sql = sql & "= '" & VB.Text & "'"
> End If
> とするのとコーディング量は大して変わらないかも知れませんが。

TMさん、ありがとうございます。
TMさんに教えていただいた方法だと、IF文を50個も並べることなく
記述することができますね。
やはりIF文がずっと並んでいると見栄えもよくないと思われるので、
TMさんの方法でいこうとおもいます。
今回の件ではいろいろと参考になりました。
だいさん、TMさん、本当にありがとうございました。