如何使用 PROC SQL 查找数值变量的长度
How to find the length of a numerical variable using PROC SQL
我有一个包含一列 phone 数字的数据集。我想使用 PROC SQL WHERE
过滤此数据集,数字的长度是 至少 7 位数字。
在正常情况下 SQL 我可以将长度函数应用于数字并且它有效,但是在 SAS 中它不允许我将它应用于数字列。
我的第一直觉是将该列转换为一个字符,然后找到它的长度,但我似乎只能在使用 put
函数时说明一个大小。
但是我什至不知道我的数字的最大大小,因为我无法计算长度!
如何使用 PROC SQL 在 SAS 中找到数值的长度?
在 SAS 中,length()
将字符串作为参数(仅)。
您必须将数字变量转换为字符:
proc sql;
select length(put(x,32. -l)) from test;
quit;
使用该功能。 -l
左对齐结果(因此忽略多余的空格)。您可以任意选择 32(因为它比应该的长得多)或至少 10 左右的任何其他值(根据您可能的数值确定 - 这可以有国家代码等)。
当然,你也可以直接说
numvar ge 1000000
哪个会做同样的事情,不是吗?
当然,phone 数字永远不应存储在数字字段中。 7位数字以7个字节为字符,8个为数字,虽然它包含7位数字,但它实际上不是数字概念。
由于您没有发布示例数据集,所以我自己创建了一个
正在创建示例数据集。将 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;
此外,您可以使用数据步 (SAS) 实现相同的效果,如下所示:
data _null_;
set test;
phonelen=length(compress(input(phonenum,.)));
if phonelen > 6;
put phonelen=;
run;
我建议使用魔法:
log10(numericphonenumber)>6
我有一个包含一列 phone 数字的数据集。我想使用 PROC SQL WHERE
过滤此数据集,数字的长度是 至少 7 位数字。
在正常情况下 SQL 我可以将长度函数应用于数字并且它有效,但是在 SAS 中它不允许我将它应用于数字列。
我的第一直觉是将该列转换为一个字符,然后找到它的长度,但我似乎只能在使用 put
函数时说明一个大小。
但是我什至不知道我的数字的最大大小,因为我无法计算长度!
如何使用 PROC SQL 在 SAS 中找到数值的长度?
在 SAS 中,length()
将字符串作为参数(仅)。
您必须将数字变量转换为字符:
proc sql;
select length(put(x,32. -l)) from test;
quit;
使用该功能。 -l
左对齐结果(因此忽略多余的空格)。您可以任意选择 32(因为它比应该的长得多)或至少 10 左右的任何其他值(根据您可能的数值确定 - 这可以有国家代码等)。
当然,你也可以直接说
numvar ge 1000000
哪个会做同样的事情,不是吗?
当然,phone 数字永远不应存储在数字字段中。 7位数字以7个字节为字符,8个为数字,虽然它包含7位数字,但它实际上不是数字概念。
由于您没有发布示例数据集,所以我自己创建了一个
正在创建示例数据集。将 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;
此外,您可以使用数据步 (SAS) 实现相同的效果,如下所示:
data _null_;
set test;
phonelen=length(compress(input(phonenum,.)));
if phonelen > 6;
put phonelen=;
run;
我建议使用魔法:
log10(numericphonenumber)>6