用户PomPazz发布此答案,用于根据输入变量创建列表:
“您需要使用宏来为您”编写“SAS代码。
这应该做你想要的。它采用以空格分隔的值列表,并根据代码指定的内容循环它们。如果您对此有疑问,请发表评论。
%macro doit(list);
proc sql noprint;
%let n=%sysfunc(countw(&list));
%do i=1 %to &n;
%let val = %scan(&list,&i);
create table somlib._&val as
select * from somlib.somtable
where item=&val;
%end;
quit;
%mend;
%doit(100 101 102);
注意,数据集不能以数字开头,所以我从'_'“
开始我的问题是,如何应用于从数据集中的变量创建列表,该变量可以在IF语句中使用,例如“IF Phone in(List)in Invalid = 1”
这需要从预定的无效号码列表中验证电话号码列表。
答案 0 :(得分:3)
您的问题的基本答案是您需要将其拉入宏变量或包含文件。
proc sql;
select distinct telephone into :tellist separated by ','
from invalid_phones;
quit;
data want;
set have;
if telephone in (&tellist.) then invalid=1;
run;
这仅限于大约32k个字符,所以如果你有超过3000个电话号码,它可能无效。如果电话是字符,则需要select distinct quote(telephone)
。
更详细的答案是,这通常效率低下。更好的是使用格式。
data for_fmt;
set invalid_phones;
start=telephone;
label='INVALID';
fmtname='TELCHECKF'; *add $ if telephone is a character field;
output;
if _n_=1 then do; *this block adds a line to deal with non-matching records (hlo=o means other);
start=.;
label='VALID';
hlo='o';
output;
end;
run;
proc format cntlin=for_fmt;
quit;
data want;
set have;
if put(telephone,TELCHECKF.)='INVALID' then invalidflag=1;
run;
这可能比list方法更快,并且没有长度问题。
答案 1 :(得分:3)
Joe的答案很棒,但我只是想补充一点,你可以在一个SQL步骤
中完成proc sql noprint;
create table want as
select *, case
when telephone in (select distinct telephone from invalid_phones) then 1
else 0
end as invalid
from have
;
quit;