2016年11月4日金曜日

SQLプロシジャのWHEREは、SASのWHEREと挙動が異なる


むかしSASのUsage Noteか何かで見かけました。

SQLプロシジャのWHERE句と、データステップやプロシジャ等で使うWHEREステートメントは、構文的に同じようで違うらしいです。


例えば、以下の例では結果が異なります。

* サンプルデータ作成 ;
data DT1;
   do i=1 to 4;
       output;
   end;
run;
  i   
  1 
  2 
  3 
  4 


* SQLプロシジャのWHERE ;
proc sql;
   select * from DT1
   where not 1 <= i <= 2;
quit;
  i   
  3
  4

* 通常のWHERE ;
proc print data=DT1 noobs;
   where not 1 <= i <= 2;
run;
  i   
  1 
  2 


SQLプロシジャの場合
「not 1 <= i <= 2」 という文に対し、「1 <= i <= 2」 ではないレコード、という解釈をする。

通常のWHEREの場合
「not 1 <= i <= 2」 という文に対し、「not 1」 の部分だけ先に評価しようとする。
つまり、「not 1」 = 「not true」 = 「false」 = 「0」 という評価がなされます。
「not 1」を「0」に置き換えた結果、「0 <= i < = 2」 というWHERE条件になるわけです。



こういう落とし穴にはまらないよう、以下のようにカッコで囲ってあげて、「カッコの中身に対してのnotだよ」というふうに明示してあげましょう。

proc sql;
   select * from DT1
   where not 1 <= i <= 2 );
quit;

proc print data=DT1 noobs;
   where not 1 <= i <= 2 );
run;
  i   
  3
  4

0 件のコメント:

コメントを投稿