sql - 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 的行的报告?
先感谢您!
解决方案
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,|)%" ;
推荐阅读
- hive - Hive 管道的设计
- two-factor-authentication - 2019 年 3 月 14 日 Google 图片图表关闭后,chart.apis.google 返回 502
- c - 镜像位图图像
- javascript - 每次都生成动态行,同时关注最后一行元素
- c# - 如何在运行时(安装时)从wix源代码获取MSI文件所在的路径
- angular - Angular 客户端错误记录到服务器
- java - 有没有更快的方法来初始化 BigQuery 客户端?
- ruby-on-rails - 如何在EB中的应用程序目录之外链接?
- javascript - 在 ReactJS 中单击时折叠引导菜单
- if-statement - 带有点范围的 Google 表格、多个 IF 和 AND 语句