Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在SAS中将变量类型从字符转换为长度不确定的数字_Variables_Sas_Type Conversion_Proc Sql - Fatal编程技术网

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

Variables 在SAS中将变量类型从字符转换为长度不确定的数字,variables,sas,type-conversion,proc-sql,Variables,Sas,Type Conversion,Proc Sql,在SAS中使用PROC SQL语句时,有时需要将变量从字符转换为数字,反之亦然。我通常使用以下两个查询: INPUT(A.KEY_ID, 8.) = B.KEY_ID 或 我的问题是,如果变量的长度是7或8,我应该在KEY_ID后面加上什么长度?我尝试了A.KEY\u ID=PUT(B.KEY\u ID,7),但它丢失了KEY\u ID长度为8的所有记录。当我使用A.KEY\u ID=PUT(B.KEY\u ID,8.)时,它将无法找到长度为7的对应KEY\u ID 多谢各位 增加: 下面是我

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

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

我的问题是,如果变量的长度是7或8,我应该在KEY_ID后面加上什么长度?我尝试了A.KEY\u ID=PUT(B.KEY\u ID,7),但它丢失了KEY\u ID长度为8的所有记录。当我使用A.KEY\u ID=PUT(B.KEY\u ID,8.)时,它将无法找到长度为7的对应KEY\u ID

多谢各位

增加:

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

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

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
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如果使用以下查询,它将返回192757行

ON INPUT(A.KEY_ID,8.) = B.KEY_ID
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如果使用以下查询,它将返回192757行

ON INPUT(A.KEY_ID,8.) = B.KEY_ID
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如果使用以下查询,它将返回192757行

ON INPUT(A.KEY_ID,8.) = B.KEY_ID
ON A.KEY_ID = COMPRESS(PUT(B.KEY_ID,8.))
ON COMPRESS(A.KEY_ID) = COMPRESS(PUT(B.KEY_ID,8.))
ON INPUT(CATS(A.KEY_ID),8.) = INPUT(CATS(B.KEY_ID),8.)
ON A.KEY_ID = PUT(B.KEY_ID,8.-L)
如果使用以下查询,它将返回192757行

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

如您所见,只有在A.KEY_ID=PUT(B.KEY_ID,8.)上使用时,它才会返回192923行,这是表A中的所有行。但是,它不会在表B中找到相应的KEY_ID,并在最终结果中返回空值。

如果我理解您的需要,唯一的问题是比较键的字符串版本——当我尝试使用时,数字版本与
输入
有效

所以对于字符串键,这对我来说很有用:

a.key_id = trim(left(put(b.key_id,8.)))
您可以简化为:

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

问题似乎在于字符串键值中存在空白。你可能需要把两边都去掉。

如果你说的是整数,那么最好把数值转换成数字并进行比较。您可以使用相同的信息读取7个字符串和8个字符串

 input(a.char_key_id,8.) = b.num_key_id
至于您遇到问题的原因,可能是因为字符版本中的前导空格和/或前导零。SAS比较会忽略尾随空格,因此您无需担心这些空格

前导零

这是更大的问题。与前导空格相比,更可能看到前导零的字符变量,因为大多数输入方法都会删除前导空格。但前导零的存在会使同一整数值具有多个字符表示形式。因此,您可以将123表示为'123'、'0123'、'00123'等。这将导致无法合并的问题

前导空格

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

put(b.num_key_id,F8.-L) = a.char_key_id
现在,如果您不知道变量是数字还是字符,并且希望代码可以用于这两种类型,那么您可以使用类似的方法将其转换为字符并返回到数字。但请注意,您的整数是否大于12位数,因为SAS将使用BEST12。格式化以转换数字

input(cats(a.key_id),8.) = input(cats(b.key_id),8.)

嗨,谢谢你的评论。我尝试了您提供的一个,它返回的结果与我运行a.key\u id=put(a.key\u id,7.)时的结果相同。如果我没有很好地描述我的问题,请原谅。我会尝试重新措辞。我匹配的密钥id为7位或8位。在第一个示例中,我使用了查询a.key\u id=put(a.key\u id,7.),但是key\u id等于8位的所有记录都无法找到匹配项。然后我使用了查询a.key\u id=put(a.key\u id,8.),但所有7位数字都无法匹配。我不知道为什么,我正在寻找一个解决方案。如果你用这个:'compress(a.key_id)=compress(put(b.key_id,8.))'这不是因为变量中有空格。变量本身有7位数和8位数的值。例如,key_id可以是xxxxxxx和xxxxxxx。如果您加入SAS数据集,其中一个数据集有一个字符串变量作为您的加入密钥,并且密钥可能是7或8位数字,那么当您尝试加入它们时,将有一个前导或尾随空格。如果您使用
procsql
连接非SAS数据,我不知道这是否正确。但是在SAS数据集的情况下,如果删除两边的空白(我以前的评论),它应该工作。如果没有,请更详细地解释您的数据,并可能发布一些示例数据。谢谢很可能A.KEY_ID没有以前导空格存储的7位字符串,而是以8存储的PUT()函数。格式将为少于10000000的数字生成前导空格。@Tom-这也是我的想法,但OP说当他去掉连接条件中的空格时,它不起作用。感谢您与我们共享所有这些信息。我试过你建议的那些,但没有达到我的预期。我会和你们分享详细的结果,也许我看错了方向。非常感谢。显示一些应匹配但不匹配的示例值。您的字符串也可能包含其他“不可见”字符