如何在procSQL中的case语句中选择一系列列



我有大约80个列名diag1到diag80。我想知道如何在procSqL中只选择30列并应用案例陈述。以下代码由于不理解范围而产生错误。

proc sql;
create table data_WANT as
select *,
case 
when **diag1:diag30** in ('F00','G30','F01','F02','F03','F051') then 1
else 0 
end as p_nervoussystem
from data_HAVE;
quit;

谢谢你,任何帮助都将不胜感激!

尝试的语法有两个问题。首先,PROC SQL不支持变量列表(因为SQL语法不支持它们(。第二,没有简单的语法来搜索N个变量以获得M个字符串的列表。

你需要某种循环。在SAS代码中要比在SQL中容易得多。

例如,您可以创建一个数组来引用您的30个变量,然后在变量上循环检查每个变量在值列表中是否都有值。一旦找到,您可以停止检查。

data want;
set have;
array vars diag1-diag30;
p_nervoussystem=0;
do index=1 to dim(vars) while (not p_nervoussystem);
p_nervoussystem = vars[index] in ('F00','G30','F01','F02','F03','F051');
end;
run;

@Tom搜索神经系统诊断代码的相反模式:

  • 通过FINDW在观察到的诊断的串联上
  • 通过观察到的诊断阵列上的CCD_ 2
data have;
infile datalines missover;
length id 8;
array dx(30) $5;
input id (dx1-dx50) (50*:$5.);
datalines;
1 A00 B00 A12
2 F00 Z12 T45
3 A01 A02 B12 F00
4 Q12
5 Q13
6 T14
7 F44 F45 F46
8 . . . . . . . . . . . . . . G30
;

data want;
length p_nervoussystem p_ns 4;
set have;
array dx dx:;
array ns(6) $5 _temporary_ ('F00','G30','F01','F02','F03','F051');
dx_catx = catx(' ', of dx(*));*  drop dx_catx;           * way 1;
do _n_ = 1 to dim(ns) until(p_nervoussystem);
p_nervoussystem = 0 < indexw(dx_catx, trim(ns(_n_)));  * way 1;
p_ns = 0 < whichc(ns(_n_), of dx(*));                  * way 2;
end;
run;```

尝试sys.tables和sys.columns并过滤您的列。

SELECT*FROM sys.tables INNER JOIN sys.columns ON columns.object_id=tables.object_id

最新更新