BookmarkSubscribeRSS Feed
SASAlex101
Quartz | Level 8

I have a long Proc SQl; statement in SAS which has multiple instances of this CASE statement about 50 lines long. Is it possible to store this case statement in a macro variable somehow so that it can just be referenced as &CaseStatement.? I want the user to be able to edit 1 statement that will propagate everywhere without having to edit multiple statements in the SQL code. Issue is that the case statement has line breaks and I'd like to preserve that to make it intuitive. 

 

Example of desired functionality;

 

%let CaseStatement = 
CASE WHEN ... THEN 1
WHEN ... THEN 6
   CASE WHEN ... THEN 7 ELSE 8 END
WHEN ... THEN ... 5 
END

Proc SQL;
Select
<fields>
,&CaseStatement. as CustomField
,<more fields>
FROM Table 
WHERE 1 = 1
blah blah blah... 
;
quit;
4 REPLIES 4
SASKiwi
PROC Star

Please post a few complete lines of your CASE statement. There may be better ways of doing this rather than using CASE.

Reeza
Super User
Yes, but macro variables have a character limit and you may likely go over it. It is probably worth investigating if a format or function may be more appropriate for your needs.
ballardw
Super User

You might show the entire 50 line long Case statement so we can actually tell what is going on. One of the fun things with macro variables is getting stuff like quotes, parentheses and special characters to behave. So the actual code would be best determine feasibility.

Since you say " multiple instances of this CASE statement" I would ask if this is identical for multiple variables? If so then almost certainly a data step with arrays would be a better solution.

Tom
Super User Tom
Super User

As long as the string is less than 64K bytes.

In fact your example is almost exactly how to do it.  The only thing missing is you left out the semicolon to end the %LET statement.

 

Here is an example of a program %subnet()  that actually builds the code dynamically and stores it into a macro variable

*----------------------------------------------------------------------;
* Generate query to get next unassigned node into a macro variable. ;
*----------------------------------------------------------------------;
%*----------------------------------------------------------------------
Query is modified based on type of variable used for node.  This query 
is put into a macro variable so it can be used twice in the program.
-----------------------------------------------------------------------;
  select catx(' ','select ',case when type='num' then 'node'
               else 'quote(trim(node),"''")' end
             ,'into :next from nodes where subnet=.')
    into :getnext 
    from dictionary.columns
    where libname='WORK' and memname='NODES' and upcase(name)='NODE'
  ;

so it can be used at more than one place in the program.

Tom_0-1675896728317.png

Tom_1-1675896757270.png

 

 

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

SAS Enterprise Guide vs. SAS Studio

What’s the difference between SAS Enterprise Guide and SAS Studio? How are they similar? Just ask SAS’ Danny Modlin.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 4 replies
  • 617 views
  • 5 likes
  • 5 in conversation