【问题标题】:SAS variable has no typeSAS 变量没有类型
【发布时间】: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 来作弊,该语句将列出日志中的所有变量。

标签: types sas


【解决方案1】:

你可以试试这个:

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_idid 不是同一类型,这将确保它们仍然可以正确匹配。请注意,缺失的数值将变为".",缺失的字符值将变为"",因此最好了解您要加入的任一列中是否存在缺失值。

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

【讨论】:

  • 这位同事只关注更改login_id 的类型,这确实需要删除*。另一种方式(你如何做,或类似的)是正确的。
  • 我还要注意,您可以保留内部查询,并使用它类似于上面:where login_id in (select put(id,8.) from work.id_list) 或类似的(或使用cats,虽然我个人认为put 更正确- cats 将使用默认的 best12. 格式,这对于长 ID 有时会很危险)。
  • @Joe:谢谢,我似乎错过了直接在select 中更改login_id 类型的要点。我有点困惑为什么这位同事认为这是要走的路。 :P
  • 这似乎奏效了。我仍然不确定如何解释另一个异常,但我很高兴你为我提供了这个答案。谢谢,美好的一天!另外,我确实尝试过早放但没有成功...暂时不记得错误消息
  • 输入 -> 字符,输入 -> 数字;你可能用错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多