Параметр макроса SAS, представляющий собой список - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать макрос, в котором одним из параметров является список. Мой макрос включает в себя proc sql с оператором where, который выглядит примерно так:

Where Name in ('sarah','ben','adam')

Я пытался сделать что-то вроде этого:

%MACRO DATA_PULL (name=);
PROC SQL;
SELECT
FROM
Where Name in &name
;
QUIT;
%MEND DATA_PULL;

%DATA_PULL (Name=('sarah','ben','adam'))

но это не работает :( любая помощь приветствуется

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Вы можете использовать автоматическую макро-переменную SYSPBUFF, которая содержит значения параметров, которые вы указали для макроса, включая скобки и запятые. Опция PARMBUFF позволяет создать макрос для работы с различным количеством параметров.

%macro data_pull / parmbuff;
    proc sql;
        select *
            from sashelp.class
                where name in &syspbuff.;
    quit;
%mend data_pull;

%data_pull('Alfred','Alice','ben','adam')

В этом примере переменная SYSPBUFF (Alfred, Alice, ben, adam) отлично подходит для вашего запроса SQL.

0 голосов
/ 09 мая 2018

Оператор SAS in не требует запятых. Это правильный синтаксис:

where Name in ('sarah' 'ben' 'adam')

чтобы можно было вызывать макрос с помощью

, names = ('sarah' 'ben' 'adam')

Вы также можете передавать запятые в параметре макроса, правильно указав значение или часть значения. В этом случае можно использовать %str.

, names = (%str('sarah','ben','adam'))

Если вы поместите %str за скобки в списке, вы также можете захотеть избежать скобок внутри %str

Некоторые примеры вызовов

%macro x(names=);

proc sql;
  create table want as
  select * from sashelp.class
  where name in &names
  ;

%mend;

%x(names=('Jane' 'James'))
%x(names=(%str('Jane', 'James')))
%x(names=%str(%('Jane', 'James'%)))
0 голосов
/ 09 мая 2018

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

То, что вы опубликовали, на самом деле является одним из способов, позволяющих включать запятые в значение параметра макроса. Вложив значение внутрь или (), SAS-компилятор узнает, что запятые не обозначают начало новых значений параметров. Если вы исправите свой макрос так, чтобы он генерировал допустимый оператор SELECT, тогда он работает.

%macro data_pull (name=);
proc sql;
select * from sashelp.class where name in &name;
quit;
%mend data_pull;

%data_pull(name=('Alfred','Alice','ben','adam'))

Но настоящее решение еще проще. Только не включайте запятые в значение для начала. Оператору IN они не нужны. Затем вы можете добавить () в коде макроса.

%macro data_pull (name=);
proc sql;
select * from sashelp.class where name in (&name);
quit;
%mend data_pull;

%data_pull(name='Alfred' 'Alice' 'ben' 'adam')

Или вы можете сделать свой макрос немного умнее, и тогда пользователь может включить () или нет при вызове макроса.

%macro data_pull (name=);
proc sql;
select * from sashelp.class
where name in (%scan(&name,1,(),q));
quit;
%mend data_pull;
0 голосов
/ 09 мая 2018

вам нужно использовать функции макросов.

 %MACRO DATA_PULL (name=);
 PROC SQL;
 SELECT *
 FROM sashelp.class
 Where Name in &name
 ;
QUIT;

%MEND DATA_PULL;

%DATA_PULL (Name = %str(('Alfred', 'Alice', 'Barbara')))
...