2016-12-16 3 views
0

Ich habe folgende if-else-Bedingungen innerhalb eines Makros SAS:Wie schreibt man elegant mehrere if-else-Bedingungen in 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; 

ich im Grunde überprüft werde, wenn eine bestimmte Ausführung eine neue Ausführung oder ein Neustart ein und füllen Sie das RFLAG für einen Neustart, N entsprechend (Y für Neuanfang). Zuerst überprüfe ich, ob restart_flg Y ist, wenn ja, überprüfe ich die Existenz eines SAS-Datensatzes (flags2), und wenn es existiert, überprüfe ich, ob einer der Datensätze existiert mit "flag = 1 und pflag <> 'N'" Bedingung und dann füllen Y oder N für rflag entsprechend. Wenn die restart_flg N an erster Stelle ist, wird die rflag auf N gesetzt.

Ich finde den Weg mehrere, wenn Bedingungen in den Code geschrieben, um weniger elegant sein. Gibt es eine bessere Möglichkeit, diese if-else-Bedingung zu schreiben oder diese Funktionalität zu erreichen?

Danke!

+0

wie über die Verwendung von a [select] (http://v8doc.sas.com/sashtml/lgref/z0201966.htm) –

Antwort

0

sicher, einfach genug:

%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; 

alternativ:

%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;