Как элегантно написать несколько условий if-else в SAS?

У меня есть следующие условия if-else в макросе SAS:

%if &restart_flg = Y %then %do;
%if %sysfunc(exist(&library.f2)) %then %do;
proc sql;
Connect to xxxxx as dbcon (user=xx pw=xx server=xx port=xxx database=xxxxx);

select * into :prcs_flag_cnt    
from connection to dbcon  (
select count(1)::smallint
from &library.f2
where flag = 1 and pflag <> 'N' 
);
quit;

%put Process count flag: &prcs_flag_cnt;

%if &prcs_flag_cnt > 0 %then %do;
%let rflag = Y;
%end;

%else %do;
%let rflag  = N;
%end;

%end;

%else %do;
%let rflag = N;
%end;

%end;

%else %do;
%let rflag = N;
%end;

В основном я проверяю, является ли конкретное выполнение новым или перезапущенным, и соответствующим образом заполняю rflag (Y для перезапуска, N для нового запуска). Во-первых, я проверяю, является ли restart_flg Y, если да, я проверяю наличие набора данных SAS (flags2), и если он существует, я проверяю, существуют ли какие-либо записи с «flag = 1 и pflag ‹> 'N'" условие, а затем заполните Y или N для rflag соответственно. Если на первом месте restart_flg стоит N, rflag устанавливается на N.

Я считаю, что множественные условия, написанные в коде, менее элегантны. Есть ли лучший способ написать это условие if-else или выполнить эту функциональность?

Спасибо!


person CuriP    schedule 16.12.2016    source источник
comment
как насчет использования выбора   -  person Imran Ali    schedule 16.12.2016


Ответы (1)


конечно, достаточно легко:

%if &restart_flg = Y %then %do;
  %if %sysfunc(exist(&library.f2)) %then %do;
    proc sql;
    Connect to xxxxx as dbcon (user=xx pw=xx server=xx port=xxx database=xxxxx);
    select * into :prcs_flag_cnt from connection to dbcon  (
      select count(1)::smallint
      from &library.f2
      where flag = 1 and pflag <> 'N' 
    );
    quit;

    %put Process count flag: &prcs_flag_cnt;

    %if &prcs_flag_cnt > 0 %then %let rflag = Y;
    %else %let rflag  = N;
  %end;
  %else %let rflag = N;
%end;
%else %let rflag = N;

альтернативно:

%let prcs_flag_cnt=0;
%if &restart_flg = Y and %sysfunc(exist(&library.f2)) %then %do;
  proc sql;
  Connect to xxxxx as dbcon (user=xx pw=xx server=xx port=xxx database=xxxxx);
  select * into :prcs_flag_cnt from connection to dbcon  (
    select count(1)::smallint
    from &library.f2
    where flag = 1 and pflag <> 'N' 
  );
  quit;
  %put Process count flag: &prcs_flag_cnt;
%end;

%if &prcs_flag_cnt > 0 %then %let rflag = Y;
%else %let rflag  = N;
person Allan Bowe    schedule 16.12.2016