我有一个数据库,我通过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
来检查它的类型。我得到的是一列空值(点)。再次,谷歌在这里没有帮助。
那么,这些数字怎么没有类型呢?此外,非常感谢有关如何解决原始问题的任何想法!
答案 0 :(得分:2)
你可以试试这个:
create table work.table as
select a.*
from connection to some_source (
select *
from some_table
) as a
inner join work.id_list as b
on cats(a.login_id) = cats(b.id);
传递给连接的SQL查询必须在主机数据库系统中有效,因此避免在该查询中引用SAS表是个好主意。要获得您希望使用in
运算符的结果,您可以在SAS数据集上inner join
。
cats()
函数盲目地将其参数转换为字符串,并删除并引导和尾随空格。因此,如果login_id
和id
的类型不同,这将确保它们仍然可以正确匹配。请注意,缺少的数字值将变为"."
,缺少的字符值将变为""
,因此您最好知道在您加入的任一列中是否缺少值
如果要显式更改连接查询中的类型,则只需列出所有列而不是使用select *
。上面的方法将避免这样做。