T:SAS/ Proc SQL - select 进入:不在:
T:SAS/ Proc SQL - select into: not in:
我目前有一个 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;
是的,您可以做到,只是您的查询语法错误。我建议在 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 为您添加逗号,方法是将出现的所有 space 字符替换为逗号。
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')
但是在 PROC SQL(以及 WHERE 语句)中你不能。因此,请改用 EQT
运算符。
WHERE NAME NOT EQT 'VARA'
您不能将变量名称与 IN
运算符一起使用。但看起来你并不是要引用变量名,而是要引用实际的字符串。因此,您需要在值周围添加引号。
在 space 分隔列表周围添加引号并不难。如果值之间恰好有一个 space。
,则可以通过一个函数调用来完成。
"%sysfunc(tranwrd(VARA VARB,%str( )," "))"
如果您的姓名列表在宏变量中,则使用 compbl()
确保只有一个 space。
%let mylist=%sysfunc(compbl(&mylist));
我目前有一个 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;
是的,您可以做到,只是您的查询语法错误。我建议在 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 为您添加逗号,方法是将出现的所有 space 字符替换为逗号。
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')
但是在 PROC SQL(以及 WHERE 语句)中你不能。因此,请改用 EQT
运算符。
WHERE NAME NOT EQT 'VARA'
您不能将变量名称与 IN
运算符一起使用。但看起来你并不是要引用变量名,而是要引用实际的字符串。因此,您需要在值周围添加引号。
在 space 分隔列表周围添加引号并不难。如果值之间恰好有一个 space。
,则可以通过一个函数调用来完成。"%sysfunc(tranwrd(VARA VARB,%str( )," "))"
如果您的姓名列表在宏变量中,则使用 compbl()
确保只有一个 space。
%let mylist=%sysfunc(compbl(&mylist));