2017-08-02 160 views
1

在SAS脚本中,我有一个宏变量,稍后在PROC SQL步骤的SQL in语句中使用。使用SAS宏变量在PROC中使用IN运算符选择所有值SQL

%let my_list = (1,2,3); 

proc sql; 
    select * 
    from my_table 
    where var1 in &my_list. 
; 
quit; 

这工作得很好,但我需要一定的灵活性,也希望能够选择所有行,而不更改SQL代码本身,而只是宏变量。

是否有一个技巧来指定宏变量,因此它选择所有仍使用IN运算符的行?(避免填补了宏变量所有可能的值的子查询解决方案)

回答

2

你可以更改您的代码

%let where_clause = var1 in (1,2,3); 

proc sql; 
    select * 
    from my_table 
    where &where_clause 
; 
quit; 

而且为了选择所有线路的宏观变量更改为%let where_clause = 1=1;

%let where_clause = 1=1; 

proc sql; 
    select * 
    from my_table 
    where &where_clause 
; 
quit; 

OR,如果你是坚定的关于保持你的代码不变,你可以简单地改变宏观变量,以便您如下where子句永远是正确的:

%let my_list = (1) or 1=1; 

proc sql; 
    select * 
    from my_table 
    where var1 in &my_list 
; 
quit; 

(脏但得到了工作完成)

+0

好直接的想法。在R等过程编程逻辑中,我一直在想太多,而不是SAS的“发现和替换”宏观方法。谢谢。 –

+0

@MarkHeckmann欢迎;) – user2877959