我的问题是 - 我有一个宏应该循环遍历字符串并在sql过程中使用这些字符串。问题是这些字符串不简单紧凑,可能有空格,引号。
输入宏%roz的字符串如下:
list1,list2
OID,in ("IDC","NPK")
OED,in ("EDC")
ZFP,in ("ZFP")
宏以这种方式看待:
%macro roz(list1,list2);
%let n=%sysfunc(countw(&list1));
%do i=1 %to &n;
%let kanal = %scan(&list1,&i);
%let inlist = %scan(&list2,&i);
proc sql;
create table data_stor1_&kanal._file as select sum(pocet)
as pocet, Dch
from data_stor3_&kanal where Dch &inlist group by dat_poc;
quit;
%end;
%mend roz;
%roz(OID OED,'in ("IDC","NPK")' 'in ("EDC")');
我的问题是我不知道如何让我的宏读取list2中的部分并保留格式(引号,空格,e.t.c。)。我可以通过从字符串切换到数字来解决我的程序中的问题,但我很好奇是否有办法直接解决它。
我的两个sql"选择"应该以这种方式看待:
create table data_stor1_OID_file as select sum(pocet) as pocet, Dch
from data_stor3_OID where Dch in ("IDC","NPK") group by dat_poc;
create table data_stor1_OED_file as select sum(pocet) as pocet, Dch
from data_stor3_OED where Dch in ("EDC") group by dat_poc;
感谢您的任何建议!
答案 0 :(得分:2)
为列表使用不是空格的字符串分隔符(并且不会出现在字符串中)。
%macro roz(list1,list2);
%let n=%sysfunc(countw(&list1,|));
%do i=1 %to &n;
%let kanal = %scan(&list1,&i,|);
%let inlist = %scan(&list2,&i,|);
proc sql;
create table data_stor1_&kanal._file as select sum(pocet)
as pocet, Dch
from data_stor3_&kanal where Dch &inlist group by dat_poc;
quit;
%end;
%mend roz;
%roz(OID|OED,%nrstr(in ("IDC","NPK")|in ("EDC")));
这样的事情。如果你愿意的话,我不需要单引号 - 使用宏引用以避免使用逗号,但我不确定你是否需要单引号。