SAS宏参数是一个列表

时间:2018-05-08 22:59:38

标签: sas sas-macro

我正在尝试创建一个宏,其中一个参数是一个列表。我的宏包含一个proc sql,其where语句具有如下内容:

Where Name in ('sarah','ben','adam')

我尝试过这样的事情:

%MACRO DATA_PULL (name=);
PROC SQL;
SELECT
FROM
Where Name in &name
;
QUIT;
%MEND DATA_PULL;

%DATA_PULL (Name=('sarah','ben','adam'))

但它不起作用:( 任何帮助赞赏

4 个答案:

答案 0 :(得分:1)

您需要使用宏引用功能。

 %MACRO DATA_PULL (name=);
 PROC SQL;
 SELECT *
 FROM sashelp.class
 Where Name in &name
 ;
QUIT;

%MEND DATA_PULL;

%DATA_PULL (Name = %str(('Alfred', 'Alice', 'Barbara')))

答案 1 :(得分:1)

SAS in运营商需要逗号。这是有效的语法:

where Name in ('sarah' 'ben' 'adam')

所以你可以用

进行宏调用
, names = ('sarah' 'ben' 'adam')

您还可以通过正确引用值或值部分在宏参数中传递逗号。在这种情况下,可以使用%str

, names = (%str('sarah','ben','adam'))

如果将%str放在列表括号外,您可能还想要转义%str

中的括号

一些示例调用

%macro x(names=);

proc sql;
  create table want as
  select * from sashelp.class
  where name in &names
  ;

%mend;

%x(names=('Jane' 'James'))
%x(names=(%str('Jane', 'James')))
%x(names=%str(%('Jane', 'James'%)))

答案 2 :(得分:1)

尝试将逗号放入宏变量的值是问题,因为逗号用于标记宏调用中参数值之间的转换。

您发布的内容实际上是一种允许在宏参数值中包含逗号的方法。通过将值包含在内部或(),SAS编译器将知道逗号不标记新参数值的开头。如果修复宏以便它生成有效的SELECT语句,那么它就可以工作。

%macro data_pull (name=);
proc sql;
select * from sashelp.class where name in &name;
quit;
%mend data_pull;

%data_pull(name=('Alfred','Alice','ben','adam'))

但真正的解决方案更容易。只是不要在值中包含逗号。 IN运算符不需要它们。然后,您可以在宏代码中添加()

%macro data_pull (name=);
proc sql;
select * from sashelp.class where name in (&name);
quit;
%mend data_pull;

%data_pull(name='Alfred' 'Alice' 'ben' 'adam')

或者你可以让你的宏更聪明,然后用户可以在调用宏时包含()

%macro data_pull (name=);
proc sql;
select * from sashelp.class
where name in (%scan(&name,1,(),q));
quit;
%mend data_pull;

答案 3 :(得分:1)

您可以使用SYSPBUFF自动宏变量,该变量包含您提供给宏的参数值,包括括号和逗号。 PARMBUFF选项允许构建一个宏来处理不同数量的参数。

%macro data_pull / parmbuff;
    proc sql;
        select *
            from sashelp.class
                where name in &syspbuff.;
    quit;
%mend data_pull;

%data_pull('Alfred','Alice','ben','adam')

在这个例子中,SYSPBUFF变量是(' Alfred',' Alice',' ben'' adam'),非常适合您的SQL查询。