使用;for loop";在SAS SQL中?
我正在SAS中使用SQL。我的数据中有很多类似的变量名,比如“var1,var2,…,var100”。我知道可以这样写使用;for loop";在SAS SQL中?,sql,sas,Sql,Sas,我正在SAS中使用SQL。我的数据中有很多类似的变量名,比如“var1,var2,…,var100”。我知道可以这样写 proc sql; select xx from xxx where var1 = a or var2 =a or var3 =a;run; 我想知道SQL是否有类似于“for loop”的函数来简化这项任务 谢谢你的帮助 根据数据库变量,您可以执行以下操作: ... WHERE a IN (var1, var2, var3, etc); 但这将是你能做的最好的了,我不知
proc sql; select xx from xxx where var1 = a or var2 =a or var3 =a;run;
我想知道SQL是否有类似于“for loop”的函数来简化这项任务
谢谢你的帮助 根据数据库变量,您可以执行以下操作:
... WHERE a IN (var1, var2, var3, etc);
但这将是你能做的最好的了,我不知道SAS是否支持它。据我所知,SAS的每个交互中都有一个
do
循环功能
IIRC,我认为它的工作原理如下:
%do i=1 %to [##];
... do iterative stuff ...
%end;
您可以使用宏来完成这项工作。 例如:
%macro loopQuery;
proc sql;
select xx
from xxx
where var1 = a
%do i=2 %to 100;
or var&i.=a
%end;
;
run;
%mend;
%loopQuery;
您可以使用
WHICH()
或WHICHC()
函数进行该类型的测试。它将返回匹配的第一个变量的索引,如果不匹配,则返回零。SAS将0视为false
where which(a,var1,var2,var3)
不幸的是,如果使用procsql,则必须列出每个变量名。与数据步骤不同,它不支持变量列表。正如Tom所指出的,在数据步骤中,这将非常容易:
data want;
set xxx;
where whichc('a', of var1-var1000);
run;
您可以使用宏变量,然后使用它。但这是一个冗长乏味的过程,数据步骤要简单得多。您可以在procsql中执行此操作,如下所示
/*first create dataset to test*/
data have;
input var1 var2 var3 var4 newvar a;
datalines;
10 20 30 40 60 10
10 20 30 40 60 90
10 20 30 40 60 20
;
run;
/* create macro variable*/
proc sql;
select catt(name, " = ", " a or ") into :VAR SEPARATED by " "
from dictionary.columns
where memname = 'HAVE'
and prxmatch("m/^VAR\d+$/i", trim(name)) > 0;/* to find variable var with digit*/
%put &VAR;
它给出var1=a或var2=a或var3=a或var4=a或
/* do a substring to remove last or */
%let final_var = %substr(&var, 1, %length(&var)-2);
%put &final_var;
它给出了var1=a或var2=a或var3=a或var4=a
/*Now you can use the macro variable in your query, will give you desired
result*/
proc sql;
select * from have
where &final_var;
不,SAS不支持。@Joe-如果您查看SAS 9.4 SQL过程用户指南,您会发现SAS确实支持SQL
IN()
条件。但它不支持IN运算符中的变量(至少在我测试它时不支持)。