如何使用 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,执行以下步骤:

  1. numeric phonenum 转换为 char 。虽然很明显位数不会大于 32,但如果您愿意,可以增加计数。
  2. 使用compress函数strip去掉空白字符
  3. 使用length函数计算位数
  4. 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