以下のように抽出条件のない空の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;
|