Types SAS变量没有类型

Types SAS变量没有类型,types,sas,Types,Sas,我有一个数据库,我通过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);; 这会生成错误:中使用的表达式具有不同数据类型的组件

我有一个数据库,我通过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);;
这会生成错误:中使用的表达式具有不同数据类型的组件

它们都应该是数字的我知道ID是数字的,但我假设登录ID必须表示为字符,并在这一步中解析为将其转换为数字。我在google上摸索了很长一段时间,试图找到一种方法来做到这一点,直到一位同事告诉我,除非我列出全部40列并使用AS,否则这一步无法完成,这将是最后的手段。我不确定他是否正确

所以我删除了WHERE子句来查看数据。这一切看起来都很好,登录ID看起来肯定是数字,所以我尝试使用VTYPE检查它的类型。我得到的是一列空值点。同样,谷歌在这方面也帮不了什么忙

那么,这些数字怎么可能没有类型呢?此外,对于如何解决原始问题的任何想法,我们都将不胜感激

您可以尝试以下方法:

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数据集上进行内部联接

cats函数盲目地将其参数转换为字符串,并删除前导空格和尾随空格。因此,如果login_id和id不是同一类型,这将确保它们仍然可以适当匹配。请注意,缺少的数值将变为。缺少的字符值将变为,因此最好知道要加入的列中是否有缺少的值


如果要显式更改连接查询中的类型,只需列出所有列,而无需使用select*。上面的方法可以避免这样做。

您能举例说明如何使用vtype吗?它是否类似于x=vtypelogin\u id;然后看看结果数据集中的x?您是否有任何日志消息?如果vtype返回点/null,则是因为您将其返回到数字列。vtype返回字符类型。@乔的钱是对的。试试长度x 100美元;x=vtypelogin\u id;为了确保您从vtype获得预期的结果,当然,您也可以始终使用proc内容来找到答案。如果您使用的是ds2或通过libname连接的RDBMS,其中一些结果可能会略有变化,但最终它应该始终返回“C”或“N”。只是关于列出所有变量的注释,您可以通过在初始PROC SQL语句中使用descripe来作弊,该语句将列出日志中的所有变量。同事只关注更改登录id的类型,这确实需要删除*。另一种方法是这样做的,或者类似的方法是正确的。我还需要注意的是,您可以保留内部查询,并使用与上面类似的方法:在selectputid中的where login\u id,8。从work.id\u列表或类似列表中,或者使用cats,尽管我个人认为这更正确-cats将使用默认的best12。格式对于长id来说有时是危险的。@乔:谢谢,我似乎没有抓住直接在select中更改登录id类型的要点。我有点困惑,为什么这位同事认为这是一条路这似乎奏效了。我仍然不知道如何解释另一个异常现象,但我很高兴你给了我这个答案。谢谢,再见!另外,我也试着放早一点,但没有成功。。。记不起此时的错误消息put->character,input->numeric;你可能用错了。