T:SAS / Proc SQL-选择:不在:

时间:2018-11-08 20:18:47

标签: select sas where proc-sql select-into

我目前有一个proc内容数据文件,如下所示:

DATA CONTENTS;
    INPUT NAME $;
    DATALINES;
        VARA
        VARB
        VARC
        VARD
        VARE
    ;
RUN;

并且我正在寻找将变量的最后一个变成这样的宏变量

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                WHERE NAME NOT IN:(VARA VARB)
;
QUIT;

我要添加的新内容是

Where name not in:(VarA varB)

有一种方法可以执行此操作,因为我的VARA和VARB是控制器页面上的用户输入,我无法将它们指定为逗号分隔,因为它们稍后将在脚本中成为“ group_by”变量。

编辑:

想象一下我的控制器中有一个宏变量

%LET group_by_variable = VARA VARB;

然后我执行相同的例程,但是像这样替换宏变量

PROC SQL;
SELECT NAME INTO: MACRO_VARIABLE
    SEPARATED BY " "
        FROM CONTENTS
            WHERE VARNUM > 1
            AND
            WHERE NAME NOT IN:(&group_by_variable.)
 ;
QUIT;

2 个答案:

答案 0 :(得分:1)

在常规SAS语句中,可以使用冒号修饰符执行截断的字符串操作。

if  NAME NOT IN: ('VARA' 'VARB')

但是在PROC SQL(以及WHERE语句)中,您不能。因此,请改用EQT运算符。

WHERE NAME NOT EQT 'VARA'

您不能在IN运算符中使用变量名称。但是,看起来您并不是要引用变量名,而是实际的字符串。因此,您需要在值周围添加引号。

在空格分隔的列表周围添加引号并不难。如果值之间只有一个空格,则可以通过一个函数调用来完成此操作。

"%sysfunc(tranwrd(VARA VARB,%str( )," "))"

如果您的名称列表在宏变量中,请使用compbl()确保只有一个空格。

%let mylist=%sysfunc(compbl(&mylist));

答案 1 :(得分:0)

是的,您可以做到,您的查询中语法错误。我建议您查阅有关SAS SQL的一些指南。

首先,每个“ select”语句只能有一个“ where”语句。摆脱第二个“哪里”,而拥有“和”。

其次,将':'放在'in'语句之后。

最后,在要检查的变量之间添加逗号。

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (VARA, VARB)
;
QUIT;

如果您不能添加逗号,只需让SAS通过用逗号替换空格字符的所有出现来为您添加逗号。

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (
                    %sysfunc(tranwrd(%quote(VARA VARB),%str( ),%str(, )))
                )
;
QUIT;