簡體   English   中英

SAS 上的條件 PROC SQL

[英]Conditional PROC SQL on SAS

我有一個包含多個 PROC SQL 的 SAS 腳本。 問題是 SQL 查詢應該基於 SAS 變量值“調整”,例如:

%let COD_COC =(52624, 52568, 52572);
%let COD_BLOC = ();

proc sql; 
create table work.abordados as 
    select t1.cd_acao, 
    t1.cd_bloc, 
    t1.cd_tip_cnl, 
    t1.cd_cmco, 
    t1.cd_cli, 
    datepart(t1.ts_ctt) format=date9. as data_abordagem,
    intnx('day',datepart(t1.ts_ctt), &Prazo_Compra) format=date9. as data_limite
from db2coc.ctt_cli_cmco t1
where (t1.cd_acao in &COD_COC)
and (t1.cd_bloc in &COD_BLOC) <<<<<<< facultative filter    
;quit;

問題是只有當 %let COD_BLOC = (); 時才應該應用第二個過濾器(&COD_BLOC 中的 t1.cd_bloc); 與“()”不同。

我一直在閱讀 SQL 上的“匹配/案例”,但據我所知,此測試適用於查詢/值的結果。 就我而言,我必須測試的是 SAS 變量。

這個怎么處理?

我認為有兩種很好的方法來做到這一點。

第一:簡單的破解。

%let COD_COC =(52624, 52568, 52572);
%let COD_BLOC = (and t1.cd_bloc in (...));
%let COD_BLOC = ;

proc sql; 
create table work.abordados as 
    select t1.cd_acao, 
    t1.cd_bloc, 
    t1.cd_tip_cnl, 
    t1.cd_cmco, 
    t1.cd_cli, 
    datepart(t1.ts_ctt) format=date9. as data_abordagem,
    intnx('day',datepart(t1.ts_ctt), &Prazo_Compra) format=date9. as data_limite
from db2coc.ctt_cli_cmco t1
where (t1.cd_acao in &COD_COC)
 &COD_BLOC <<<<<<< facultative filter    
;quit;

多田,現在它只是被忽略了。 如果您希望使用第二行(並將值放入...),請注釋掉或刪除第二行。

二、比較妥當的方法,是使用宏語言。 宏中更常見,但在 9.4m7(最新版本,現在已有幾年歷史)中,您可以在開放代碼中執行此操作。

%let COD_COC =(52624, 52568, 52572);
%let COD_BLOC = ();

proc sql; 
create table work.abordados as 
    select t1.cd_acao, 
    t1.cd_bloc, 
    t1.cd_tip_cnl, 
    t1.cd_cmco, 
    t1.cd_cli, 
    datepart(t1.ts_ctt) format=date9. as data_abordagem,
    intnx('day',datepart(t1.ts_ctt), &Prazo_Compra) format=date9. as data_limite
from db2coc.ctt_cli_cmco t1
where (t1.cd_acao in &COD_COC)
%if %sysevalf(%superq(COD_BLOC) ne %nrstr(%(%))
and (t1.cd_bloc in &COD_BLOC) <<<<<<< facultative filter    
;quit;

您必須小心ne ()位,因為()是宏語言語法元素,因此長%nrstr以確保它們被正確地視為字符。 %str也可以,我只是默認為%nrstr 。)

知道您只想在有一個或多個值時應用COD_BLOC列表過濾器,並且正確的列表將至少包含 3 個源代碼字符(*) ,您可以測試長度作為使用宏變量。

%IF在開放代碼中時,您需要一個%do %end塊,如下所示:

...
%if %length(&COD_BLOC) > 2 %then %do;
  and t1.cd in &COD_BLOC
%end;

...

當代碼在宏內時,可以使用上面或下面

...
%if %length(&COD_BLOC) > 2 %then
and t1.cd in &COD_BLOC
;
...

暫無
暫無

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

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