%macro v3(datain,flaga,flagb);
%if &flaga = LT %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;
%v3(aa,LT,error);
I always get error instead of LT in this case. Why?
Try it with quotes. i.e.,
%macro v3(datain,flaga,flagb);
%if "&flaga" = "LT" %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;
%v3(aa,LT,error)
and, since you're probably going to ask "why?", I think it is because LT is being considered an operator. I'd call this a bug, but I'm sure that someone else will say it is a feature.
You will get the desired results by not using an operator as the value. e.g.:
%macro v3(datain,flaga,flagb);
%if &flaga. = TT %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;
%v3(aa,TT,error)
Try it with quotes. i.e.,
%macro v3(datain,flaga,flagb);
%if "&flaga" = "LT" %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;
%v3(aa,LT,error)
and, since you're probably going to ask "why?", I think it is because LT is being considered an operator. I'd call this a bug, but I'm sure that someone else will say it is a feature.
You will get the desired results by not using an operator as the value. e.g.:
%macro v3(datain,flaga,flagb);
%if &flaga. = TT %then
%do;
%put &flaga;
%end;
%else
%do;
%put &flagb;
%end;
%mend v3;
%v3(aa,TT,error)
Yes, that's right. Within a %IF condition, LT = "less than".
Macro language makes comparisons from left to right. The first comparison within:
%if &flaga = LT
compares &flaga to the null value before "LT" to see if they are equal. Macro language finds that they are not equal, so the comparison is false. False comparisons generate a 0, while true comaprisons generate a 1. So the second comparison compares 0 to see if it is less than the null value following "LT". That comparison is also false, so the %ELSE statement kicks in. To verify that this is happening, try using the same parameters, but modifying the %IF statement:
%if &flaga = LT 2 %then %do;
Regardless of the value of &flaga, this comparison should always be true. Macro language will always be comparing either (0 LT 2) or (1 LT 2).
Hope this helps rather than confuses!
Folks, thanks a lot!
Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.
Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.