BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
KCKC
Calcite | Level 5

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

1 ACCEPTED SOLUTION

Accepted Solutions
art297
Opal | Level 21

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)

View solution in original post

3 REPLIES 3
art297
Opal | Level 21

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)

Astounding
PROC Star

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!

KCKC
Calcite | Level 5

Folks, thanks a lot!

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 1147 views
  • 3 likes
  • 3 in conversation