SQLでの条件分岐はCASE式を使うのですが、普段書いているSASのIFステートメントと少し違うので、なかなか書き方がぱっとでてこず、調べたりしてしまうことが多い方もいると思います。
条件分岐が面倒だからSQLは使わないという方もいたりするので、邪道かもしれませんが、SASでのSQLの使用を普及させたい僕としては、どうしてもCASE文が嫌いならとりあえずIFC,IFN関数を使ってみればと提案しています。
戻り値が数字の場合はIFN、文字の場合はIFC関数になります。
この関数はEXCELのIF関数と同じで
IFN(条件式,真の場合の戻り値,偽の場合の戻り値)といった感じで使います。
まず通常のデータステップで説明します。
以下のデータセットがあったとします。
data Q1;
X=1;Y='い';output;
X=2;Y='ろ';output;
X=3;Y='は';output;
run;
data A1;
set Q1;
_X=IFN(X=1,X*10,X*20);
_Y=IFC(Y='い','A','B');
run;
を実行すると
こうなります。
関数を入れ子にすることで、階層的な条件分岐を表現できます。
data A2;
set Q1;
_X=IFN(X=1,X*10,IFN(X=2,X*20,999));
_Y=IFC(Y='い','A',IFC(Y='ろ','B','Z'));
run;
を実行すると
となります。
これをSQLのCASE式でかくなら
proc sql noprint;
create table A3 as
select X,Y
,case X
when 1 then X*10
when 2 then X*20
else 999
end as X_
,case Y
when 'い' then 'A'
when 'ろ' then 'B'
else 'Z'
end as Y_ length=200
from Q1;
quit;
となります。改行の仕方によりますが、やはりぱっと見、ボリュームが、もさっとしがちに感じてしまします。
そこで、IFC IFN関数を使用してみます。
proc sql noprint;
create table A4 as
select X,Y
,IFN(X=1,X*10,IFN(X=2,X*20,999)) as _X
,IFC(Y='い','A',IFC(Y='ろ','B','Z')) as _Y
from Q1;
quit;
こざっぱりします。ただ条件分岐が多くて入れ子にすると深すぎるなら、
CASE式の方が見通しやすいと思います。
まあ好みの問題ですが、無理してでもCASE式の書き方に慣れた方が、他のシステムで
SQL書くときにも使えるので、いいとは思います。
0 件のコメント:
コメントを投稿