2018年9月2日日曜日

【小ネタ】抽出条件のないWHEREステートメント





以下のように抽出条件のない空のWHEREステートメントを書いてもエラーになりません。

data a;
   set sashelp.class;
   where;
run;

抽出条件が掛かれていないので、すべてのオブザベーションが読み込まれます。




これが出来るからなんなのか、、っていうと、例えば以下のようなマクロを定義したい場合ですね。

* マクロ定義 ;
 %macro test( wh= );

   data a;
      set sashelp.class;
      where &wh;
   run;

 %mend;


* マクロ実行 ;
 %test( wh=age=13 )  /* マクロ実行:抽出条件を指定する場合 */
 %test( wh= )              /* マクロ実行:抽出条件を指定しない場合 */



抽出条件があればマクロ変数whに条件を指定すればいいし、なければ何も指定しなければいいだけ。
抽出条件がある場合とない場合で%ifとか使って分岐処理とかさせる必要ありません。







ただ、where=データセットオプションでは条件を空にするのはダメのようです。

data a;
   set sashelp.class (where=());
run;

ログ
 ERROR: WHERE式の読み込み中に、構文エラーが発生しました。

 ERROR 22-322: 構文エラーです。次のいずれかを指定してください: 名前, 引用符で囲んだ文字列, 
               数値定数, 日時定数, 欠損値, INPUT, PUT.  

 ERROR 76-322: 構文エラーです。ステートメントを無視しました。

 ERROR 6-185: データセットのオプションリストに')'のかっこがありません。

 ERROR 79-322: )を指定してください。

 NOTE: エラーが発生したため、このステップの処理を中止しました。
 WARNING: データセットWORK.Aは未完成です。このステップは、0オブザベーション、
          0変数で停止しました。
 WARNING: このステップを中止したため、データセットWORK.Aを置き換えていません。


ログが怒りすぎ、なんかかわいいです。



なので私は以下のように書いてSASをごまかしています。

data a;
   set sashelp.class (where=(1));
run;

「1」は真(true)の意味です。
常に条件が真(true)の状態、つまり全オブザベーションが読み込まれます。


「0」ってのもあります。

   set sashelp.class (where=(0));


この「0」は偽(false)の意味です。
常に偽(false)の状態、つまり全オブザベーション読み込まれません。



勿論この書き方はwhereステートメントでも通用します。

data a;
   set sashelp.class;
   where 1;
run;


0 件のコメント:

コメントを投稿