SAS: макрос, который имитирует возвращаемое значение из функции (пустая строка или макропеременная) - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в SAS и, возможно, наивно пытаюсь имитировать построение макросов как функции в SAS.

У меня есть несколько макропеременных, которые инициируются из хранимого процесса. Некоторые могут иметь значения, а другие могут быть пустыми.

%let a1 = column_name1;
%let a2 = column_name2;
%let a3 = ;

%let col1 = &a1;
%let col2 = &a2;
%let col3 = &a3;

Я хочу использовать их в proc sql как:

proc sql;
  create table some_table as
  select 
  &col1 AS column1,
  &col2 AS column2,
  &col3 AS column3
  from some_table;
quit;

Однако, это не будет работать для переменных, которые пусты (&col3). Поэтому я пытаюсь создать какую-то функцию, которая будет оберткой вокруг нее. Что-то вроде:

%macro macro_return_string(macro_variable);
        %if length(macro_variable) = 1 %then %do; /* if column_name# is not empty, then it len() is always >2 */
            "";
        %end;
        %else %do;
            macro_variable;
        %end;

%mend macro_return_string;

Так что будет использоваться как:

%let col1 = macro_return_string(&a1); /* return column_name1 */
%let col2 = macro_return_string(&a2); /* return column_name2 */
%let col3 = macro_return_string(&a3); /* return "" */

Спасибо за помощь!

Аналогичный вопрос был задан здесь , но я не могу решить свою проблему из него.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Макрос не является системой, основанной на функциях, как другие языки сценариев или кодирования. Макрос - это система обработки текста с побочными эффектами, которая может выдавать или не выдавать исходный код для использования отправляющей системой.

Ваш макрос будет выдавать ""; прямо в операторе sql, который вы пытаетесь сгенерировать, и точка с запятой (;) объединяет работы. Точка с запятой в макросе может быть уместной, если у вас есть %if только с %then, а не %then do; … %end;

Макрос для присвоения var (1) "" столбцу, когда в аргументе макроса нет выражения, должен быть:

%macro macro_return_string(macro_variable);
        %if length(&macro_variable) %then %do;/* there is something in the variable passed, resolve it for emittance as source code*/
&macro_variable/* no semi-colon here */
        %end;
        %else %do;/* argument is empty, emit a blank character as the source code for the default expression*/
" "/* no semi-colon here */
        %end;
%mend macro_return_string;
0 голосов
/ 06 ноября 2018

Основная проблема с вашим макросом - это дополнительные точки с запятой, которые он излучает. Если вы хотите создать макрос в стиле «функция», то вы не можете испустить немаскированную точку с запятой, потому что она прервет команду, которую вы пытаетесь создать.

%macro macro_return_string(macro_variable);
%if 0=length(&macro_variable) %then %do; 
 " "
%end;
%else %do;
  &macro_variable
%end;
%mend macro_return_string;

Также, если вы уверены, что хотите добавить цитаты? Вы когда-нибудь будете использовать это для создания символьных переменных?

%macro macro_return_string(macro_variable,type=num);
%if 0=length(&macro_variable) %then %do; 
 %if &type=num then . else " ";
%end;
%else %do;
  &macro_variable
%end;
%mend macro_return_string;
...