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

Select T:SAS/Proc SQL-选择到:不在:,select,sas,where,proc-sql,select-into,Select,Sas,Where,Proc Sql,Select Into,我目前有一个proc contents数据文件,如下所示: DATA CONTENTS; INPUT NAME $; DATALINES; VARA VARB VARC VARD VARE ; RUN; 我想把最后一个变量变成一个宏变量 PROC SQL; SELECT NAME INTO: MACRO_VARIABLE SEPARATED BY " "

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

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;
PROC SQL;
SELECT NAME INTO: MACRO_VARIABLE
    SEPARATED BY " "
        FROM CONTENTS
            WHERE VARNUM > 1
            AND
            WHERE NAME NOT IN:(&group_by_variable.)
 ;
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:(VARA VARB)
;
QUIT;
PROC SQL;
SELECT NAME INTO: MACRO_VARIABLE
    SEPARATED BY " "
        FROM CONTENTS
            WHERE VARNUM > 1
            AND
            WHERE NAME NOT IN:(&group_by_variable.)
 ;
QUIT;

是的,你可以做到,你只是在你的查询中有糟糕的语法。我建议查阅一些有关SAS SQL的指南

首先,每个select语句只能有一个where语句。去掉第二个“where”,只使用“and”

其次,将“:”放在“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;

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

if  NAME NOT IN: ('VARA' 'VARB')
但在procsql(以及WHERE语句)中,您不能这样做。因此,请改用
EQT
运算符

WHERE NAME NOT EQT 'VARA'
不能将变量名称与运算符中的
一起使用。但看起来并不是要引用变量名,而是实际的字符串。因此,您需要在值周围添加引号

"%sysfunc(tranwrd(VARA VARB,%str( )," "))"
在以空格分隔的列表周围添加引号并不困难。如果两个值之间只有一个空格,则可以通过一个函数调用来实现

"%sysfunc(tranwrd(VARA VARB,%str( )," "))"
如果名称列表位于宏变量中,请使用
compbl()
确保只有一个空格

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

嗨,Josh,谢谢你的回答,但我要找的是一个答案,它要么告诉我没有逗号(,)是可能的,要么没有逗号是不可能的,我已经编辑了我的问题,以便更详细explicit@MattMcilwham好的,那么您可以用逗号替换字符串中的空格。我已经编辑了我的答案,以展示如何。