【问题标题】:How to find the length of a numerical variable using PROC SQL如何使用 PROC SQL 查找数值变量的长度
【发布时间】:2015-03-04 20:52:44
【问题描述】:

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

在普通 SQL 中,我可以只在数字周围应用长度函数并且它可以工作,但是在 SAS 中它不会让我将它应用到数字列。

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

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

【问题讨论】:

  • 您如何处理以零开头的电话号码?格式仍然可以显示前导零,但基础数值不会,因此您的长度可能是错误的
  • @Keith 任何电话号码(至少在美国)都不能以零开头,除非它是国际号码并包含 011 退出代码(在这种情况下,它会远远超过 7位数)。
  • @Joe 啊,好的。比在英国这里它们都以零开头(这就是它们主要作为字符存储在数据库中的原因)要好。我正在考虑将VVALUE 函数与LENGTH 结合使用
  • 很遗憾,vvalue 在 PROC SQL 中不可用。

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


【解决方案1】:

由于您没有发布示例数据集,所以我为自己创建了一个

创建示例数据集。以phonenumnumeric 与您的情况相同。

data test;
infile datalines;
input phonenum : 8.;
datalines;
123
1234
12345
123456
1234567
12345678
123456789
12345678910
;
run;  

你的方法是对的,如果要计算位数,必须将其转换为char,执行以下步骤:

  1. numeric 电话号码转换为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;

此外,您还可以使用 datasteps(SAS) 实现相同的效果,如下所示:

data _null_;
set test;
phonelen=length(compress(input(phonenum,$32.)));
if phonelen > 6;
put phonelen=;
run;

【讨论】:

    【解决方案2】:

    在 SAS 中,length() 将字符串作为参数(仅)。

    您必须将数值变量转换为字符:

    proc sql;
        select length(put(x,32. -l)) from test;
    quit;
    

    使用该功能。 -l 左对齐结果(因此忽略多余的空格)。您可以任意选择 32(因为这比它应该长得多)或任何其他值至少 10 左右(根据您可能的数值确定 - 这可以有国家代码等)。

    当然,你总是可以直接说

    numvar ge 1000000
    

    哪个会做同样的事情,不是吗?

    当然,电话号码永远不应该存储在数字字段中。 7位数字需要7个字节作为字符,8个作为数字,虽然它包含7位数字,但它实际上不是一个数字概念。

    【讨论】:

    • 我在做length(put(numvar,32.))的时候发现,然后查看numvar的长度分布,全部返回32。我想看看数字有多少位数但这不适合我
    • 啊 - 它使数字右对齐,我忘记了。
    【解决方案3】:

    我建议使用魔法:

    log10(numericphonenumber)>6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多