SQL中的列变量数组

时间:2018-08-15 19:37:40

标签: sql arrays variables sas

是否可以在sql中创建列变量数组以执行如下操作(请原谅语法):

array(Col1,Col2,Col3);

update tempTable
    for(i=1;i<3;i++){
        set array[i] = 
            case missing(array[i]) 
                then 0*1
            else
                array[i]*1
            end
};

注意:我正在SAS中使用proc SQL步骤

所需功能: 在表的多个列上的上述for循环中执行该操作,而无需为每个列编写单独的set语句。

2 个答案:

答案 0 :(得分:3)

可以使用SAS宏来完成您想要的工作。

如果这是本地SAS表,则更容易使用“数据步骤”对其进行更新。

data have;
set have;
array v[3] col1 col2 col3;

do i=1 to 3;
    v[i] = sum(v[i],0);
end;

drop i;
run;

sum()函数对值求和(很明显)。如果缺少一个值,则不添加该值,并添加其余值。因此,如果缺少该列,您将得到0;否则,您将得到该列的值。

答案 1 :(得分:1)

SAS宏为您编写SAS代码。它们是生成SAS代码的预编译脚本。

您想要的代码看起来像

update table
   set col1 = ...  ,
       col2 = ...  ,
       ....        ,
   ;

这是一个脚本。它生成一个测试表,定义宏,然后在表上调用该宏。它使用其他答案中的sum()函数。

data have;
array col[3];

do r=1 to 100;
    do i=1 to 3;
        if ranuni(123)> .8 then
            col[i] = .;
        else
            col[i] = rannor(123);
    end;
    output;
end;
drop i r;
run;

%macro sql_zero_if_missing(data, cols);
%local n i col;
%let n=%sysfunc(countw(&cols));

proc sql noprint;
update &data
    set
    %do i=1 %to &n;
        %let col=%scan(&cols,&i);
        &col = sum(&col,0)
        %if &i ^= &n %then , ;
    %end;
;
quit;

%mend;

options mprint;
%sql_zero_if_missing(have, col1 col2 col3);

MPRINT选项将使您看到生成的SAS代码。这是日志:

  

MPRINT(SQL_ZERO_IF_MISSING):proc sql noprint;

     

MPRINT(SQL_ZERO_IF_MISSING):更新已设置col1 = sum(col1,0),   col2 = sum(col2,0),col3 = sum(col3,0);

     

注意:已更新100行   在WORK.HAVE中。

     

MPRINT(SQL_ZERO_IF_MISSING):退出;