2016-12-16 2 views
0

У меня есть следующее, если-иначе условие в макросе 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), и если он существует, я проверяю, существует ли какая-либо из записей с флагом = 1 и pflag <> 'N' а затем заполнить Y или N для rflag соответственно. Если параметр restart_flg равен N на первом месте, значение rflag равно N.

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

Спасибо!

+0

как об использовании [выберите] (http://v8doc.sas.com/sashtml/lgref/z0201966.htm) –

ответ

0

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

%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; 
Смежные вопросы