2016-12-16 758 views
0

我有一個SAS宏內下面的if-else條件:如何在SAS中優雅地編寫多個if-else條件?

%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條件或完成此功能?

謝謝!

+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; 
相關問題