如何使用PROC SQL查找数值变量的长度

时间:2015-03-04 20:52:44

标签: sql sas numerical string-length proc-sql

我有一个包含电话号码列的数据集。我想使用PROC SQL WHERE过滤此数据集,数字的长度至少 7位数。

在普通的SQL中,我可以在数字周围应用长度函数,但它可以正常工作,但是在SAS中它不会让我将它应用于数值列。

我的第一直觉是将列转换为字符,然后找到它的长度,但是当我使用put函数时,我似乎只能说出一个大小。 但是我甚至不知道我的数字的最大尺寸,因为我无法计算长度!

如何使用PROC SQL在SAS中找到数值的长度?

3 个答案:

答案 0 :(得分:6)

由于您尚未发布样本数据集,因此我为自己创建了一个

创建样本数据集。将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关键字执行此操作变量类型。

  5. 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