ラベル ステートメント: SELECT の投稿を表示しています。 すべての投稿を表示
ラベル ステートメント: SELECT の投稿を表示しています。 すべての投稿を表示

2018年4月3日火曜日

IF vs SELECT



「IFは使うけど、SELECTは全然使わない、むしろ要らないよ」っていう人がいたので、IFとSELECTを勝負させてみたいと思います。



各ステートメントについては以下で解説してます。

・IF-THEN-ELSE入門 【条件分岐処理】
・SELECT-WHEN入門 【条件分岐処理】




ROUND1.

以下は、変数VAR1の値によって、VAR2の値を設定しています。
data DT1;

   VAR1 = "b";

   * IFステートメントの場合 ;
   if         VAR1 = "a" then VAR2 = 1;
   else if  VAR1 = "b" then VAR2 = 2;
   else if  VAR1 = "c" then VAR2 = 3;

run;


このように、ひとつの変数の値によって処理を分岐する場合にSELECTがつかえます。

data DT2;

   VAR1 = "b";

   * SELECTステートメントの場合 ;
   select (VAR1);
      when ("a")  VAR2=1;
      when ("b")  VAR2=2;
      when ("c")  VAR2=3;
      otherwise   VAR2=.;
   end;

run;

SELECTの方がスッキリしている気がします。なのでSELECTの勝ちです。




ROUND2.

以下は、変数VAR1の1バイト目の値によって、VAR2の値を設定しています。

data DT3;

   length VAR1 VAR2 TEMPVAR $10.;
   VAR1 = "M001";

   * IFステートメントの場合 ;
   TEMPVAR = substr( VAR1,1,1);

   if         TEMPVAR = "M" then VAR2 = "MALE";
   else if  TEMPVAR = "F" then VAR2 = "FEMALE";

   drop TEMPVAR;
run;

TEMPVARという変数にVAR1の1バイト目を入れておいて、最後にこの変数をDROPしています。


このような場合も、SELECTの方がスッキリしてみえます。

data DT4;

   length VAR1 VAR2 $10.;
   VAR1 = "M001";

   * SELECTステートメントの場合 ;
   select (substr(VAR1,1,1));
      when ("M")   VAR2 = "MALE";
      when ("F")    VAR2 = "FEMALE";
      otherwise      VAR2 = "";
   end;

run;

IFの時は、「TEMPVAR = substr(VAR1,1,1);」っていう変数作って、あとでDROPしましたが、
SELECTの時は、「select (substr(VAR1,1,1));」って書いちゃえば、変数作らずに済んでDROPステートメントが不要になります。


これもSELECTの勝ち。



てことで、SELECTの完全勝利ですね。
(ちなみにハンデとしてSELECTが勝てる勝負だけ選びました)

2016年3月10日木曜日

SELECT-WHEN入門 【条件分岐処理】



SELECT-WHEN は変数の値によって処理を分岐するような場合に使います。



書き方1

data DT1;
  set SASHELP.CLASS;
  select (AGE);
       when (11)       X=1;     * ① ;
       when (12)       X=2;     * ② ;
       when (13)       X=3;     * ③ ;
       when (14,15)  X=4;     * ④ ;
       otherwise       X=99;   * ⑤ ;
  end;
run;


・AGEの値によって変数Xにいれる値を分岐しています。
・①~④の順に見ていって「AGEの値と一致する ”最初のWHENステートメント”」のみ実行される。
・AGEの値がどれにも一致しなかった場合⑤のOTHERWISEが実行される。

※ AGEがどのWHENステートメントにも一致しない場合、OTHERWISEがないとエラーになる。



書き方2

data DT1;
  set SASHELP.CLASS;
  select;
       when (AGE=11 and WEIGHT>100)   X=1;
       when (AGE=12 and WEIGHT>100)   X=2;
       otherwise                                            X=99;
  end;
run;

こちらも「条件に該当する ”最初のWHENステートメント”」のみ実行される。



応用

data DT1;
  set SASHELP.CLASS;
  select;
      when (AGE=11) do;
          X1=1;
          X2=1;
      end;
      otherwise;
  end;
run;

・DO~ENDで囲めば、処理を複数書ける。
・「OTHERWISE ;」のように処理文を省略すると「OTHERWISEの場合、なにも処理しないで」という指定になる。