2015年4月22日水曜日

SQLプロシジャ入門15:NULLの取扱い


SASのSQLと、他のデータベースで用いられるSQLとで大きく異なるのが、NULLの取り扱いです。

同じデータに対して、SASのSQLプロシジャで実行した結果と、MSAccessのSQLで実行した結果を比較してみます。


SASのSQLプロシジャの場合

*** サンプルデータ作成 *************;
data DT1;
input A @@;
cards;
1 2 . 3
;
run;

  1 
  2  
  .  
  3

*** A < 2 のレコードを抽出 **********;
proc sql;
   select A
   from DT1
   where A < 2;
quit;

  1 
  .  


*** A ^= 1 のレコードを抽出 **********;
proc sql;
   select A
   from DT1
   where A ^= 1;
quit;

  2  
  .  
  3


MSAccessのSQLの場合

*** サンプルデータ ******************;


*** A < 2 のレコードを抽出 ************;


結果


*** A ^= 1 のレコードを抽出 ***********;


結果


比較してみると、SASでは結果にNULLのレコードが含まれているのに対し、MSAccessの結果にはNULLが含まれていません。


この違いの原因は、聞きかじり程度の知識なので、あまりあてにならないかもですが、

データベースでのNULLは「未知」とか「適用不能」といった意味合いがあるようです。
つまり今回の例のように「2より小さい」とか「1以外である」といった事を、未知・適用不能といった意味合いをもつNULLに対して、語ることができないので、抽出結果からAがNULLのレコードが出てこなかったわけです。

昔SEの方から「このNULLの仕様を知らずにシステムを組まれたことがあって大変なことになった。」という話を聞きました。
当時は原因が分からずバグとして片づけられ、SQL禁止としたそうな。。。


一方、SASのSQLプロシジャでは、SAS内での互換性を保つために、上記のようなNULLの特別扱いはしていません。



ちなみに、SASとは関係ない話になりますが、このNULLに関するお話が、SASYAMAさんに教えて頂いた「達人に学ぶSQL徹底指南書」というのに詳しく書かれていて、読んでて面白かったのでおススメしたいです。↓↓


以上、今回でSQLプロシジャ入門は終わり(の予定)です。

14.データセットを縦結合する【UNION】
15.NULLの扱いに関する注意点

0 件のコメント:

コメントを投稿