2015年4月22日水曜日

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




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

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


SASのSQLプロシジャの場合

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

  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のレコードが出てこなかったわけです。


一方、SASのSQLプロシジャでは、SAS内での互換性を保つために、上記のようなNULLの特別扱いはしていません (データステップ等での欠損値の取り扱いと一緒)

ただし、SAS/ACCESSの機能を使って、DBMS等の外部データにアクセスする場合は、NULLの扱いが異なるので注意!
例えば、LIBNAMEステートメントを使って外部データにアクセスする場合や、パススルー機能によって外部データに送信するクエリとかでは、NULLの取り扱いが異なります
(「外部データに対応するエンジン」や「記述方法」などの要素によってそれぞれNULLの挙動が異なる)

SASやDBMS等のNULLの取り扱いとも違う場合があって、私もよく分かりません。。というわけで、ご注意ください。




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


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

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

0 件のコメント:

コメントを投稿