以下のように抽出条件のない空の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をごまかしています。
「1」は真(true)の意味です。
常に条件が真(true)の状態、つまり全オブザベーションが読み込まれます。
「0」ってのもあります。
この「0」は偽(false)の意味です。
常に偽(false)の状態、つまり全オブザベーション読み込まれません。
勿論この書き方はwhereステートメントでも通用します。
なので私は以下のように書いて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 件のコメント:
コメントを投稿