Выберите переменную, только если существует SAS SQL

PROC SQL;
    CREATE TABLE SET3 AS 
    SELECT 
        a.VAR1 , b.VAR1 AS P_VAR1 , 
        a.VAR2          
    FROM SET1 AS a FULL JOIN SET2 AS B
    ON  a.VAR1 = b.VAR1 
 ;
QUIT;

Приведенный выше код создает таблицу с именем SET3 и включает VAR1 из двух наборов данных вместе с VAR2, где a.VAR1=b.VAR1.

Я хочу, чтобы этот код включал VAR2, если он доступен. Иногда это не так, поэтому код дает сбой.

Я мог бы сделать это, дважды написав код с некоторыми макросами, но мне было интересно, есть ли быстрый синтаксис SQL, который можно было бы использовать.

Большое спасибо!


person Jason Rogers    schedule 12.12.2016    source источник


Ответы (1)


Одним из вариантов является создание макропеременной, которая будет либо иметь VAR1, либо VAR1, VAR2 в зависимости от того, существует ли она. dictionary.columns — это таблица метаданных, из которой вы можете получить это, которая доступна в proc sql.

Порядок окончательных данных будет немного другим (a.VAR1, a.VAR2, b.VAR1), но, надеюсь, это не будет проблемой.

proc sql noprint;
select cats('a.',name) into :varlist separated by ','
from dictionary.columns
where libname='WORK' and memname='SET1' and name in ('VAR1','VAR2');
quit;

%put &=varlist.;

PROC SQL;
    CREATE TABLE SET3 AS 
    SELECT 
        &varlist. , b.VAR1 AS P_VAR1
    FROM SET1 AS a FULL JOIN SET2 AS B
    ON  a.VAR1 = b.VAR1 
 ;
QUIT;
person Longfish    schedule 12.12.2016
comment
Пожалуйста, эта строка для чего? %put &=varlist.; или вы имеете в виду: %put &varlist.; - person D. O.; 12.12.2016
comment
Он просто помещает значения &varlist. в журнал. %put &=varlist. — это сокращенный способ кодирования %put VARLIST=&varlist. - person Longfish; 12.12.2016
comment
ХОРОШО! Спасибо за это объяснение. - person D. O.; 12.12.2016