使用;for loop";在SAS SQL中?

使用;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); 但这将是你能做的最好的了,我不知

我正在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);

但这将是你能做的最好的了,我不知道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运算符中的变量(至少在我测试它时不支持)。