在SAS中将变量类型从字符转换为数字,长度不确定

时间:2017-01-11 19:54:32

标签: variables sas type-conversion proc-sql

当我在SAS中使用PROC SQL语句时,有时我需要将变量从字符转换为数字,反之亦然。我通常使用以下两个查询:

INPUT(A.KEY_ID, 8.) = B.KEY_ID

OR

A.KEY_ID = PUT(B.KEY_ID, 8.)

我的问题是,如果变量的长度是7或8,我应该在KEY_ID后放多长?我尝试了A.KEY_ID = PUT(B.KEY_ID,7。),它丢失了KEY_ID长度= 8的所有记录。当我使用A.KEY_ID = PUT(B.KEY_ID,8。)时,它将无法找到长度= 7的相应KEY_ID。

非常感谢!

添加了:

以下是我目前使用的查询。 LibnameA是本地库,tableA是本地SAS表。 DatabaseB是我连接的数据库。 Key_id列位于两个表中,并用作链接它们的键。例如,key_ids是1234567,12345678和ect。

当我使用以下查询时,我将长度7放在put语句的末尾,所有8位数字key_ids的记录将无法找到匹配项。

PROC SQL;
CREATE TABLE LIBNAMEA.WORKTABLE AS
SELECT
A.*,
B.VAR1,
B.VAR2
FROM LIBNAMEA.TABLEA A
LEFT JOIN DATABASEb.TABLEB B
ON A.KEY_ID = PUT(B.KEY_ID,8.)
;
QUIT;

更新结果:

如果我使用以下查询,则返回192758行

ON A.KEY_ID = PUT(B.KEY_ID,7.)

如果我使用以下查询,则返回192923行

ON A.KEY_ID = PUT(B.KEY_ID,8.)

如果我使用以下查询,则返回192757行

ON INPUT(A.KEY_ID,8.) = B.KEY_ID

如果我使用以下查询,则返回192757行

ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))

如果我使用以下查询,则返回192757行

ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))

如果我使用以下查询,则返回192757行

ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)

如果我使用以下查询,则返回192757行

ON A.KEY_ID = PUT(B.KEY_ID,8.-L)

正如你所看到的,只有当我使用ON A.KEY_ID = PUT(B.KEY_ID,8。)时,它才会返回192923行,这是表A中的所有行。但是,它不会找到相应的表B中的key_ids,并在最终结果中返回null值。

2 个答案:

答案 0 :(得分:0)

如果我了解您的需要,唯一的问题是比较键的字符串版本 - 我尝试时使用INPUT的数字版本。

因此对于字符串键,这对我有用:

a.key_id = trim(left(put(b.key_id,8.)))

您可以简化为:

a.key_id = compress(put(b.key_id,8.))

问题似乎是字符串键值中有空白。你可能需要在两边剥掉它。

答案 1 :(得分:0)

如果您正在谈论整数,那么您最好将值转换为数字并进行比较。您可以使用相同的信息读取7个字符串和8个字符串。

 input(a.char_key_id,8.) = b.num_key_id

至于为什么遇到麻烦,可能是因为字符版本中的前导空格和/或前导零。 SAS比较忽略尾随空格,因此您不必担心这些。

领先的零

这是一个更大的问题。由于大多数输入方法将删除前导空格,因此更有可能看到前导零的前导零字符变量。但是前导零的存在可以使相同的整数值具有多个字符表示。所以你可以代表123作为' 123'' 0123'' 00123'等等。这将导致麻烦,而不仅仅是能够合并。

领先空间

当您尝试将整数转换为字符串时,这可能会成为一个问题。 PUT()函数通常右对齐值(因此它生成前导空格),而大多数输入方法将以左对齐值(尾随空格)结束。因此,如果使用put(12345,8.)将整数12345转换为字符串,则将导致三个前导空格' 12345',并且它将与您的字符变量中具有尾随空格的值{{1}不匹配}。您可以为格式添加对齐命令。而且由于SAS忽略尾随空格,您可以使用更长的格式。

'12345   '

现在,如果您不知道您的变量是数字还是字符,并且您希望代码可以使用,那么您可以使用这样的代码转换为字符并返回数字。但要注意你的整数是否大于12位数,因为SAS将使用BEST12。格式转换数字。

put(b.num_key_id,F8.-L) = a.char_key_id