即使在找到真实条件后也要评估“何时”和“其他”语句的情况

时间:2019-07-15 14:39:25

标签: sql if-statement sas case

使用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语句。

2 个答案:

答案 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或任何数据库中,我对执行所需操作的方式并不十分熟悉。