3

我有一个需要转换为 R 的 SAS 宏,由于我是 SAS 新手,所以在理解代码的一部分时遇到了一些麻烦。

在宏的开头,我有定义宏的这一行 -

%MACRO macroname(sdate=01JAN2011,edate=01JAN2013, FILTERS=platform in (1,2,3),OUT=data_final)

%if %length(&filters) > 2 %then %let filters = and &filters; 
%else %let filters = %str( );

在宏的一个阶段中,我有以下命令 -

proc sort data = A noduplicates;
  where 1 &filters;
  by id, date;
  run;

我了解在 where 条件下,将应用过滤条件。但是 1 有什么作用呢?同样,过滤列上的 if else 条件有什么作用?

谢谢!

4

1 回答 1

2

这也可以写成 1=1,本质上是一个静态的 TRUE 条件。

这实际上是一个巧妙的小技巧,可以解决添加多个 where 子句(作为宏变量)的问题。每个 where 条件必须由运算符(AND / OR,通常为 AND)分隔,但并不总是知道另一个条件是否在您要添加的条件之前。例如,您可能希望灵活地将相同的内容添加&filter到这两个 where 子句中:

where x=1 &filter;

where &filter;

当然,第一个示例必须解析为x=1 AND some=filter;,第二个示例不得解析为where AND some=filter;

请记住,where 子句中的任何条件最终都会解析为真或假。通过添加“1”,我们有一个静态的“TRUE”条件,它对查询没有影响,但如果我们总是在前面加上“ AND" 到 & 过滤器。

where 1 &filter  

代替

where %if %length(&filter)>4 and "%substr(%upcase(&filter))" ne AND %then %do;
   where 1 and &filter
%end;
%else %do;
   where &filter
%end;
于 2014-02-22T10:30:05.103 回答