Sas 在具有不同字符长度的变量上连接两个数据集

Sas 在具有不同字符长度的变量上连接两个数据集,sas,Sas,我试图用下面的代码连接一个变量上两个字符长度不同的数据集,但两个都不起作用,我不知道为什么 FROM A AS ROLLACT LEFT JOIN MALT.CUST AS ACCOUNT /* ON (ROLLACT.ACCTNO, BEST.) = INPUT( ACCOUNT.ACCT_NO,BEST.) */ ON INPUT (ROLLACT.ACCTNO, 30.) = INPUT( ACCOUNT

我试图用下面的代码连接一个变量上两个字符长度不同的数据集,但两个都不起作用,我不知道为什么

 FROM A   AS ROLLACT
    LEFT JOIN MALT.CUST            AS ACCOUNT   

    /*    ON  (ROLLACT.ACCTNO, BEST.)  = INPUT( ACCOUNT.ACCT_NO,BEST.) */
          ON  INPUT (ROLLACT.ACCTNO, 30.)  = INPUT( ACCOUNT.ACCT_NO,30.)
在本例中,
ROLLACT.ACCTNO
是长度为30的字符变量,
ACCT\u NO
是长度为19的字符变量

所以我很困惑为什么我不能将两者转换为特定的长度(使用输入(30.)):

我还尝试使用以下方法将两者转换为数字:

 ON  (ROLLACT.ACCTNO, BEST.)  = INPUT( ACCOUNT.ACCT_NO,BEST.)

是否有人对如何在Proc Sql步骤中执行此操作提出建议?

您无需执行任何特殊操作来比较不同长度的字符串。SAS将忽略尾随空格。显然,如果长变量的实际值超过19个字符,它将永远不会匹配限制为19个字符的值


INPUT()函数不会更改长度。If用于将字符串转换为值。如果使用数字信息,如示例中所示,则结果是一个数字。但您不能将30位字符串精确转换为数字。SAS将数字存储为8字节浮点值,因此精度的小数位数最大为15。

一个简单的substr可以做到这一点:
ON(substr(ROLLACT.ACCTNO,1,19))=ACCOUNT.ACCT\u NO
理想情况下,我会简单地使用:ON ROLLACT.ACCTNO=ACCOUNT.ACCT_NO-我认为它与数据步骤一起工作,并简单地合并数据集。但是,我希望将其合并到procsql中,这似乎更为特殊。那么,是否有人知道如何处理Proc Sql步骤中的格式?Proc Sql使用与其他SAS代码相同的函数。除非已将查询推入外部数据库。在这种情况下,您将需要使用外部数据库的语言。
 ON  (ROLLACT.ACCTNO, BEST.)  = INPUT( ACCOUNT.ACCT_NO,BEST.)