[英]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.