簡體   English   中英

即使在找到真實條件后也要評估的情況When和Else語句

[英]Case When and Else statements being evaluated even after finding a true condition

使用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不存在”。 我在線上找到了許多消息來源 ,說應該在找到第一個真實條件后退出。 考慮到由於某種原因可能正在評估所有的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語句。

在代碼開始運行后修改代碼為時已晚。

假設您的宏變量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;

SAS是正確的。 你是混淆了解析 SQL語句計算表達式。

在解析階段,所有表和列都必須存在。 這與實際評估表達式不同。

我不太熟悉在SAS proc sql或任何數據庫中執行所需操作的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM