【问题标题】:Syntax error using CATX in SAS PROC SQL在 SAS PROC SQL 中使用 CATX 的语法错误
【发布时间】:2016-06-23 04:30:47
【问题描述】:

尝试在 PROC SQL 中使用 CATX("|", of 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 和 data 步骤产生预期的“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, ^=, |, ||, ~=.

谢谢

【问题讨论】:

  • 似乎您正在扩展 proc sql 的灵活性/与 sas 语言的其他部分的完全集成。不幸的是,明确的方式可能是你最好的选择。除非您有几十列,在这种情况下,宏变量可能会有所帮助。

标签: sas


【解决方案1】:

您在 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 表达式中不需要的列。

【讨论】:

    【解决方案2】:

    此语法“OF a1-a5”仅用于数据步代码。 "proc sql" sas过程是最简单的sql代码,不能和data-step代码混用。

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2017-07-16
      • 1970-01-01
      相关资源
      最近更新 更多