尝试在PROC SQL中使用CATX(“|”,a1-a5)时,我在SAS 9.4中生成语法错误。
为什么前两个输出有效,但第三个输出失败?
data test;
input a1 $ a2 $ a3 $ a4 $ a5 $;
cards;
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
;
run;
proc sql;
select CATX('|',a1,a2,a3,a4,a5) as catx from test;
quit;
data test2;
set test;
catx=CATX('|',OF a1-a5);
run;
proc print data=test2; run;
proc sql;
select CATX('|',OF a1-a5) as catx from test;
quit;
第一个proc sql和数据步骤产生预期的“a | b | c | d | e”等。但是第三个proc sql产生一个指向“a1”的语法错误:
32 proc sql;
33 select CATX('|',OF a1-a5) as catx from test;
--
22
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, ',', -, '.', /, <, <=, <>, =, >, >=, ?, AND, BETWEEN,
CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET, OR, ^=, |, ||, ~=.
由于
答案 0 :(得分:0)
您已经在Proc SQL中找到了其中一个墙,其中一些基本SAS功能未得到完全支持。正如前面提到的那样,您最好创建一个包含连接所需列的宏变量。
这是一个简单的例子:
proc sql noprint;
select name into :cols separated by ','
from dictionary.columns
where libname = "WORK" and
memname = "TEST";
quit;
%put &cols;
proc sql;
select CATX('|',&cols) as catx from test;
quit;
显然,您的where
子句会更复杂,因为您的原始数据集可能包含CATX
表达式中不需要的列。
答案 1 :(得分:0)
这种语法&#34; OF a1-a5&#34;仅为数据步骤代码指定。 &#34; proc sql&#34; sas过程是一个最简单的sql代码,它不能与数据步骤代码混合。