【发布时间】:2014-12-30 18:48:22
【问题描述】:
我有一个通过 SAS EG 5.1 程序中的 PROC SQL 步骤导入的数据库
原来我这样做的代码如下:
CREATE TABLE WORK.TABLE AS
SELECT * FROM connection to some_source (
SELECT *
FROM some_table
WHERE LOGIN_ID IN (SELECT ID FROM WORK.ID_List);;
这产生了错误:“使用 IN 的表达式具有不同数据类型的组件。”
这些都应该是数字(我知道 ID 是数字)但我假设LOGIN_ID 必须表示为字符并在此步骤中将其转换为数字。我在谷歌上摸索了很长一段时间,试图找到一种方法来做到这一点,直到一位同事告诉我,除非我列出所有 40 列并使用AS,否则这一步无法完成,这将是最后的手段。我不确定他是否正确。
所以我删除了WHERE 子句来查看数据。一切看起来都很好,LOGIN_ID 看起来肯定是数字,所以我尝试使用VTYPE 来检查它的类型。我得到的是一列空值(点)。再次,谷歌在这里没有帮助。
那么,这些数字怎么可能没有类型呢?此外,非常感谢有关如何解决原始问题的任何想法!
【问题讨论】:
-
你能举例说明你是如何使用
vtype()的吗?是不是类似于x = vtype(login_id);,然后您在结果数据集中查看x?你有任何日志消息吗? -
如果
vtype返回点/空值,那是因为您将其返回到数字列。vtype返回字符类型。 -
@Joe 是正确的。尝试
length x $ 100; x = vtype(login_id);以确保您从vtype()获得预期结果。 -
当然,您也可以随时使用
proc contents来找出答案。如果您使用ds2或通过 libname 连接的 RDBMS,其中一些结果可能会略有不同,但最终它应该总是返回“C”或“N”。 -
只是关于列出所有变量的注释,您可以通过在初始 PROC SQL 语句中使用 DESCRIBE 来作弊,该语句将列出日志中的所有变量。