前のページ|次のページ

%IF-%THEN/%ELSEステートメント

マクロの一部を条件付きで処理します。

種類: マクロステートメント
制限事項: マクロ定義でのみ使用可能
コメント以外のテキストは、ACTIONの終了を示すセミコロンと%ELSEステートメントの間で使用することはできません。

構文

%IF expression %THEN action;< %ELSE action;>

必須引数

%IF expression

整数に置き換えられる任意のマクロ式を指定します。この式がゼロ以外の整数に置換される場合、同式はtrueとなり、%THEN句が処理されます。この式がゼロに置換される場合、同式はfalseとなり、%ELSE句が(存在するならば)処理されます。この式がヌル値に置換されるか、または非数値文字を含む値に置換される場合、マクロプロセッサはエラーメッセージを発行します。マクロ式の作成とその評価方法の詳細については、マクロ式を参照してください。

%IF-%THENステートメントでの式の使用例を次に示します。
  •  %if &name=GEORGE %then %let lastname=smith;
  •  %if %upcase(&name)=GEORGE %then %let lastname=smith;
  •  %if &i=10 and &j>5 %then %put check the index variables;

%THEN action

定数テキスト、テキスト式、マクロステートメントのいずれかを指定します。actionにセミコロンが含まれている場合(たとえばSASステートメントを指定する場合など)、%THENの直後の最初のセミコロンで%THEN句が終了します。action内にあるセミコロンが原因で%IF-%THENステートメントが終了するのを防ぐには、%DOグループを使用するか、または%STRなどのクォーティング関数を使用します。次の例では、セミコロンを含むテキストを条件に応じて生成する2つの方法を示しています。

  •  %if &city ne %then %do;
                   keep citypop statepop;
                %end;
             %else %do;
                   keep statepop;
                %end;
  •  %if &city ne %then %str(keep citypop statepop;);
                %else %str(keep statepop;);

詳細

マクロ言語には、サブセット化%IFステートメントは含まれていません。このため、%THENを指定せずに%IFステートメントを使うことはできません。
%IF-%THENステートメントで文字値を比較する式では、ホストオペレーティングシステムの並べ替え順を使用して比較が行われます。お使いの動作環境における並べ替え順の詳細については、Base SASプロシジャガイドのThe SORT PROCEDUREを参照してください。
コメント以外のテキストは、ACTIONの終了を示すセミコロンと%ELSEステートメントの間で使用することはできません。次の例を実行した場合、余分なセミコロンがテキストとして処理されます。したがって、エラーメッセージがSASログに書き込まれます。
 %if &city ne %then %do;
               keep citypop statepop;
            %end; ; 
         %else %do;
               keep statepop;
            %end;

比較

%IF-%THEN/%ELSEステートメントとIF-THEN/ELSEステートメントは似ていますが、両者は別の言語に属しています。SASマクロ言語の一部である%IF-%THEN/%ELSEステートメントは、通常、条件に応じてテキストを生成します。一方、SAS言語の一部であるIF-THEN/ELSEステートメントは、DATAステップの実行時に、条件に応じてSASステートメントを実行します。
%IF-%THEN/%ELSEステートメントの条件として指定される式には、定数テキストか、または定数テキストを生成するテキスト式であるオペランドのみを含めることができます。一方、IF-THEN/ELSEステートメントの条件として指定される式には、DATAステップ変数、文字定数、数値定数、日付および時刻定数のみを含めることができます。
%IF-%THEN/%ELSEステートメントがDATAステップの一部となるテキストを生成する場合、そのテキストはDATAステップコンパイラによりコンパイルされ実行されます。一方、IF-THEN/ELSEステートメントがDATAステップ内で実行される時点で、マクロ機能により生成されたテキストはすべてその置換、トークン化、コンパイルが済んでいます。コンパイル済みのコード内にはマクロ言語要素は存在しません。両ステートメントの違いについては、次に示す例1:%IF-%THEN/%ELSEステートメントとIF-THEN/ELSEステートメントを組み合わせて使用するを参照してください。
詳細については、SASプログラムとマクロ処理およびマクロ式を参照してください。

例1: %IF-%THEN/%ELSEステートメントとIF-THEN/ELSEステートメントを組み合わせて使用する

次に示すマクロSETTAXでは、%IF-%THEN/%ELSEステートメントを使用してマクロ変数TAXRATEの値を検査することで、2つのDATAステップのうちどちらを生成するかを制御しています。最初のDATAステップには、DATAステップ変数SALEを使用してDATAステップ変数TAXの値を設定するIF-THEN/ELSEステートメントが含まれています。
%macro settax(taxrate);
   %let taxrate = %upcase(&taxrate);
   %if &taxrate = CHANGE %then
      %do;
         data thisyear;
            set lastyear;
            if  sale > 100 then tax = .05;
            else tax = .08;
         run;
      %end;
   %else %if &taxrate = SAME %then
      %do;
         data thisyear;
            set lastyear;
            tax = .03;
            run;
      %end;
%mend settax;
マクロ変数TAXRATEの値がCHANGEである場合、このマクロは次のDATAステップを生成します。
DATA THISYEAR;
   SET LASTYEAR;
   IF SALE > 100 THEN TAX = .05;
   ELSE TAX = .08;
RUN;
マクロ変数TAXRATEの値がSAMEである場合、このマクロは次のDATAステップを生成します。
DATA THISYEAR;
   SET LASTYEAR;
   TAX = .03;
RUN;

例2: レポートの条件付き表示

次の例では、%IF-%THEN/%ELSEステートメントを使用して、2つのレポートのうちどちらかを生成するステートメントを生成しています。
%macro fiscal(report);
   %if %upcase(&report)=QUARTER %then
      %do;
         title 'Quarterly Revenue Report';
         proc means data=total;
            var revenue;
         run;
      %end;
   %else
      %do;
         title 'To-Date Revenue Report';
         proc means data=current;
            var revenue;
         run;
      %end;
%mend fiscal;
%fiscal(quarter)
マクロFISCALを呼び出すと、次のステートメントが生成されます。
TITLE 'Quarterly Revenue Report';
PROC MEANS DATA=TOTAL;
VAR REVENUE;
RUN;
前のページ|次のページ|ページの先頭へ