小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

SQLサーバーとVB6(VBA)でのNULLの扱い

まず、DB上のNULLとは、値でも変数でもなく、何もない状態を云います。具体的には、SQLサーバーのテーブルで、NOT NULL制約でない項目は、文字列系項目(char,varchar等)でも数値系項目(int,decimal等)でも、当然、何もない状態はNULLなのです。


つまり、SQLのWhere句でNULLを引っ掛けるときには、値でも変数でもないので比較述語(= NULL)は使えず、『IS NULL』を使います。かりに、比較述語を使った場合は、適用結果は、ture でなく false でもなく必ず unknown になるとのことです。したがって、比較述語(= NULL)ではNULLを判断できないのです。なので、『IS NULL』を使います。


さて、テーブルからSelect句でNULLを受けるVB6(VBA)側では、それをVariant型変数で受けます。


これは、テーブルの各項目に文字列系項目や数値系項目があり、VB6(VBA)側でも文字列系変数や数値系変数があるので、各々それ毎に受ければよさそうですが、文字列系項目や数値系項目にNULLの状態が存在する可能性がある以上、 NULLの状態を保てない文字列系変数や数値系変数で受けることは出来ず、NULLの状態を保てるVariant型変数で受け取るしかないのです。


受け取ったNULLは、VB6(VBA)でも、値ではなく状態なので、比較述語(関係演算子)が使えず、IsNull関数を使います。


最後に、DBでの否定問合せ時のNULLの弊害について、面白いページありましたのでご紹介します。

NOT INのサブクエリで使用されるテーブルの選択列にNULLが存在する場合、SQL全体の結果は常に空になります。

とのことです。