在SAS PROC SQL中使用CATX的语法错误

时间:2016-06-23 04:30:47

标签: sas

尝试在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, ^=, |, ||, ~=.

由于

2 个答案:

答案 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代码,它不能与数据步骤代码混合。