我正在尝试创建一个宏,其中一个参数是一个列表。我的宏包含一个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'))
但它不起作用:( 任何帮助赞赏
答案 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查询。