当我在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值。
答案 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