使用SAS,我创建了一个称为Flag的全局宏变量,该变量根据代码采用的途径为0或1。如果为0,则仅创建表A。如果为2,则创建A和B。然后,我想创建一个汇总表。如果仅存在A,则需要A中某个变量的最大值。如果B存在,则需要B中相同变量的最大值,而不是A。我的SQL代码如下:
Proc SQL; create table WANT as
case
when &flag. = 0 then (select max(var) from A)
when &flag. = 1 then (select max(var) from B)
end as Var2
from HAVE;
问题是当Flag = 0(正确,表B将不存在)时,我收到一条错误消息,提示“表B不存在”。我在网上发现了许多sources,说应该在找到第一个真实条件后退出。考虑到由于某种原因可能正在评估所有的when子句,我尝试将其更改为如下所示:
Proc SQL; Create table WANT as select
case
when &flag. = 0 then (select max(var) from A)
else (select max(var) from B)
end as Var2;
在上面的代码中,它甚至都不应该进入else语句。我知道一个事实,变量和比较都可以正确解析,因为我已经分别尝试了它们,并且在flag = 1时也可以正常工作。我可以使用许多替代方法,例如虚拟表,全局%if-%thens等。我希望能够解决代码中的问题,而且还想知道我是否了解SQL如何处理其CASE-WHEN语句。
答案 0 :(得分:2)
在代码开始运行后修改代码为时已晚。
假设您的宏变量FLAG具有实际值(而不是您要引用的某些变量的名称),则可以使用宏逻辑有条件地生成代码。
proc sql ;
create table WANT as
%if &flag. = 0 %then %do;
select max(var) from A
%end;
%else %do;
select max(var) from B
%end;
;
quit;
如果更改过程以将源数据集的名称放入宏变量而不是将值设置为0或1,则可能会更容易。然后,您可以使用该宏变量代替查询中的数据集名称。
%let sourceds=A;
proc sql ;
create table WANT as select max(var) from &sourceds;
quit;
答案 1 :(得分:1)
SAS是正确的。您正在将评估表达式与解析 SQL语句混淆。
在分析阶段,所有表和列都必须存在。这与实际计算表达式不同。
在SAS proc sql
或任何数据库中,我对执行所需操作的方式并不十分熟悉。