2017-02-01 25 views
0

Я пишу макрос 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 не существует. Я тоже попытался объединиться, это тоже не сработало.

Только один из двух столбцов будет существовать на таблицах, переданных макросу. Итак, мне нужно динамически присоединяться к столбцу, который существует в моей текущей таблице.

Предложения пожалуйста!

+0

1) Функция EXIST() проверяет наличие набора данных, а не переменной. (2) Поскольку вы сделали макрос, вы можете использовать логику% IF для условного генерирования кода SAS, который вы хотите запустить. Таким образом, вы НЕ можете генерировать ссылки на переменные, которые не существуют. В вашем примере нет условно сгенерированного кода. Я подозреваю, что вы хотите заменить оператор CASE на команду% IF ..% THEN% ELSE. – Tom

+0

Не можете ли вы попросить программиста, который вызывает макрос, сказать макросу, какое имя переменной использовать? – Tom

+0

Спасибо за ваш ответ Том! Макрос большой и использует различные столбцы, которые могут существовать для нескольких таблиц, а не для других. Даже после условного%, если логика ложна, почему компилятор ищет имена переменных, которые следуют ложному условию. Это не только один столбец, у меня есть несколько таких столбцов, вы не хотите добавлять параметры, разве у нас нет работы. – Rhea

ответ

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; 
+0

Спасибо Том! Но, как я уже упоминал, у меня есть несколько таких проверок в коде, чтобы условно присоединиться к существующим столбцам. Не хотите искать, а затем создавать макропеременные для всех из них, я бы скорее передал их в качестве макропеременных. Необходимо сделать код более быстрым и эффективным. – Rhea