Правильная опция where=
будет
data new (where=(name in ('John', 'David', 'Ralph'));
Готовы ли вы передать вашему макросу список значений в кавычках?
Как выглядит текущий макрос?
Предположим, что макрос принимает одно значение без кавычек:
%macro my_macro (name);
data new (where=(name="&name"));
set sashelp.class;
run;
%mend;
%my_macro (Alfred)
Измененный макрос, принимая список значений в кавычках, потребует %STR('value-1', ..., 'value-n' )
в вызове макроса для маскировки запятых. Без маскировки каждое значение будет считаться отдельным аргументом.
%macro my_macro (names);
data new (where=(name in (&names)));
set sashelp.class;
run;
%mend;
%my_macro (%str('Alfred', 'Jane'))
Оператор SAS in позволяет разделить список значений через пробел, поэтому этот вызов также будет работать.
%my_macro ('Alfred' 'Jane')
Если вы хотите, чтобы значения имени не заключались в кавычки, когда вы передаете их, вам нужно больше кодировать. Опции PARMBUFF
%macro
позволят вашему коду обращаться к автоматической c переменной syspbuff
, то есть ко всем после имени макроса.
Таким образом, вызов
%my_macro (Alfred, Jane, Authur)
приведет к тому, что syspbuff
будет
(Alfred, Jane, Authur)
См. Документацию % MACRO Macro Statement - Пример # 3 это показывает, как %DO
l oop и %SCAN()
используются для анализа значений из SYSPBUFF
Перед тем как спуститься в эту кроличью нору, спросите себя: "Что если само значение фильтра нужно содержать запятую "? «Простой» контракт ценностей без кавычек внезапно становится головной болью. Вызываемому абоненту необходимо замаскировать запятые с помощью %str
%my_macro (Alfred,William,Wayne%str(,)Bruce,%str(Grayson, Dick))
Перевернув проблему, вы можете передать список с разделителями , соответствующий любому из этих значений , а затем использовать функцию, например как FINDW
проверить на совпадение
%macro my_macro (names);
data new (where=(FINDW("&names",trim(name),'|')));
set sashelp.class;
run;
%mend;
%my_macro (Alfred|Jane)