SASのSQLプロシジャと、他のデータベースで用いられるSQLとで大きく異なるのが、NULLの取り扱いです。
同じデータに対して、SASのSQLプロシジャで実行した結果と、MSAccessのSQLで実行した結果を比較してみます。
SASのSQLプロシジャの場合
*** サンプルデータ作成 *************; data DT1; input A @@; cards; 1 2 . 3 ;
*** A < 2 のレコードを抽出 **********; proc sql; select A from DT1 where A < 2; quit;
*** Aが1以外のレコードを抽出 **********; proc sql; select A from DT1 where A ^= 1; quit;
|
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プロシジャ入門は終わり(の予定)です。
15.NULLの扱いに関する注意点
0 件のコメント:
コメントを投稿