首页 > 解决方案 > SQL 错误:在贡献表中未找到以下列

问题描述

下面是 SAS 中的一个假设 SQL 查询。此表包含一列以 A、B 和 C 开头的单词。我使用这些逗号分隔值创建了一个宏变量,并且我想生成一个仅包含第一个字母为 B 的单词的报告。

%let Letter=A, B, C;
proc sql;
select *
from Words
where Letter = %scan("&Letter", 2, ",");
quit;

出于某种原因,我得到以下信息:“错误:在贡献表中找不到以下列:B”

为什么 WHERE 语句要查找名为 B 的列,而不是生成所有单词首字母为 B 的行的报告?

先感谢您!

标签: sqlsas

解决方案


SAS 宏处理器用于生成文本,然后将其传递给 SAS 执行,就好像那是程序的原始文本一样。您使用宏函数 %SCAN() 在 SAS 期望变量名的位置生成文本 B。错误消息说它找不到变量 B,因为您要求它使用变量 B。

在使用宏代码生成程序之前,请确保您知道要生成什么程序。所以也许你想生成语句:

select * from Words where Letter like "B%" ;

这将发现 WORDS 中的所有观察值都是以大写 B 开头的变量 LETTER。

要从您的宏变量(也称为 LETTER)生成它,您可以使用如下代码:

select * from Words where Letter like "%scan(&letter,2,%str(,))%" ;

请注意,您的 LETTER 示例值实际上不会生成您想要的内容。相反,如果将生成此代码:

select * from Words where Letter like " B%" ;

它查找以空格开头然后是大写 B 的值。那是因为您在逗号后包含了一个空格。

将值列表放入宏变量时,使用逗号以外的分隔符要容易得多。例如,您可以使用|字符。

%let list=A|B|C;
select * from Words where Letter like "%scan(&letter,2,|)%" ;

推荐阅读