我有一个包含电话号码列的数据集。我想使用PROC SQL WHERE
过滤此数据集,数字的长度至少 7位数。
在普通的SQL中,我可以在数字周围应用长度函数,但它可以正常工作,但是在SAS中它不会让我将它应用于数值列。
我的第一直觉是将列转换为字符,然后找到它的长度,但是当我使用put
函数时,我似乎只能说出一个大小。
但是我甚至不知道我的数字的最大尺寸,因为我无法计算长度!
如何使用PROC SQL在SAS中找到数值的长度?
答案 0 :(得分:6)
由于您尚未发布样本数据集,因此我为自己创建了一个
创建样本数据集。将phonenum
视为numeric
与您的情况相同。
data test;
infile datalines;
input phonenum : 8.;
datalines;
123
1234
12345
123456
1234567
12345678
123456789
12345678910
;
run;
您的方法是正确的,如果您想计算位数,则必须将其转换为char
,执行以下步骤:
numeric
phonenum转换为char
。虽然很明显,数字位数不会超过32,但如果您愿意,还可以增加数量。compress
功能将strip
关闭空白字符length
功能计算位数proc sql\SAS
中,您无法在where
语句中使用新创建的变量,但proc sql
允许您在此之前使用calculated
关键字执行此操作变量类型。proc sql;
select length(compress(put(phonenum,32.))) as phonelen from test where calculated phonelen > 6;
quit;
此外,您可以使用datasteps(SAS)实现相同的功能,如下所示:
data _null_;
set test;
phonelen=length(compress(input(phonenum,$32.)));
if phonelen > 6;
put phonelen=;
run;
答案 1 :(得分:0)
在SAS中,length()
将字符串作为参数(仅限)。
您必须将数字变量转换为字符:
proc sql;
select length(put(x,32. -l)) from test;
quit;
使用该功能。 -l
左对齐结果(因此忽略额外的空格)。您可以随意选择32(因为它比它应该的长得多)或任何其他值至少10左右(根据您可能的数值确定 - 这可能有国家代码等)。
当然,你总是可以说
numvar ge 1000000
会做同样的事,不是吗?
当然,电话号码不应存储在数字字段中。 7位数字作为字符7字节,8作为数字,虽然它包含7位数字,但它实际上不是数字概念。
答案 2 :(得分:-2)
我建议使用魔法:
log10(numericphonenumber)>6