需要有条件地加入两列中的一列(以哪个为准)

时间:2017-02-01 00:46:28

标签: sql sas proc

我正在写一个sas宏,我试图加入两个列中的一个,无论哪个存在。但是,当我给出这样的东西时,它会出错,因为它希望两列都存在:

%Macro Base_pop(ssc,input_table,POPN_TBL);

PROC SQL;
    CREATE TABLE test_&ssc. AS 
        SELECT B.ACCOUNT_ID 
        FROM ADL_EXT.&input_table.TB  INNER JOIN
             ADL_BSE.BRDM_POP_FLG_&POPN_TBL.B
             ON B.ACCOUNT_ID = (CASE WHEN %sysfunc(exist(TB.ACCOUNT_ID)) then TB.ACCOUNT_ID
                                     ELSE TB.FAC_ID                                                                       
                                END)
        WHERE B.FLG = 'Y'
        ORDER BY B.ACCOUNT_ID ;

QUIT;

%MEND;

表示TB.Account_id不存在的代码错误。我也尝试过合并,但也没用。

传递给宏的表中只存在两列中的一列。 所以,我需要动态连接当前表中存在的列。

建议请!

1 个答案:

答案 0 :(得分:0)

您的问题描述表明您要测试变量的存在,但您没有包含任何代码来执行此操作。进行该测试的一种方法是查询有关该表的SAS元数据。因此,下面的代码将使用它在输入数据集中找到的名字ACCOUNT_ID或FAC_ID,并使用它。如果未找到,则会将错误消息写入SAS日志。

%macro base_pop(ssc,input_table,popn_tbl);
%local out ina inb var ;
%let out=test_&ssc ;
%let ina=%upcase(adl_ext.&input_table);
%let inb=%upcase(adl_bse.brdm_pop_flg_&popn_tbl);

proc sql noprint ;
  select name into :var
    from dictionary.columns
    where libname = "%scan(&ina,1,.)"
      and memname="%scan(&ina,2,.)"
      and upcase(name) in ('ACCOUNT_ID','FAC_ID')
  ;
%if (&sqlobs) %then %do;
  create table &out as
    select b.account_id
    from &ina a inner join &inb b
    on b.account_id = a.&var
    where b.flg = 'y'
    order by b.account_id
  ;
%end;
%else %put ERROR: Could not find either ACCOUNT_ID or FAC_ID in &ina ;

quit;

%mend base_pop;