在SAS 9.4M6中,where语句和if语句在dealing char上有什么区别?

问题描述 投票:0回答:1

最近,我偶然发现一件有趣的事情。

data test;
    set sashelp.class;
    if _N_ in (2 3 5 7) then name = '';
run;

data test;
    set ;
    where name;
run;

结果是: 数据Test有15个观测值。

我用SAS 9.4M6一年多了,不记得了。where statment可以像布尔类型变量一样处理char类型变量。我直接把 whereif 并引导结果。name不是一个数字变量,而Test数据的观测值为0。

所以我的两个问题是这样的。1. 是否 where name; 另一种 where name is not missing如果没有,提交时会发生什么?where name? 2. 什么时候开始,这种代码(where <variable>;)开始在SAS中是允许的吗?

谢谢大家的提示。

if-statement sas where-clause
1个回答
1
投票

是的,它是一个非空值的测试。 我已经用了很多年,主要是在交互式浏览数据集的时候。 我怀疑自从SAS引入WHERE语句以来,或者至少自从他们重新构建它以使用与SQL WHERE子句相同的语法以来,它一直存在。

WHERE语句使用PROC SQL风格的语法(使用LIKE不使用变量列表),但IF语句使用正常的SAS语法。

所以如果你使用

if name ;

在你的数据步骤中,那么你会看到关于SAS试图将字符变量name转换为一个数字的说明,它可以评估为false(缺失的零)或true(任何其他值)。 由于SASHELP.CLASS中的name不能转换为数字,那么所有的name都将被处理为false。


1
投票

有趣的发现! 我也没有注意到这一点。我在9.4M4和9.4M5上都试过,得到的结果是一样的。这可能是比这更早加入的东西。我也没有看到相关的文档。通过测试,我能够看到的是这样的。

  1. where 语句可以自动转换字符,如 if name 变成布尔语句

  2. if 语句不会自动将字符转换为布尔值,而是需要用户明确说明你要排除的字符,例如

Code.我不知道这是什么时候添加的,但比我能接触到的版本更早。

data want;
    set test ;
    if(NOT missing(name));
run;

我不知道这是什么时候添加的,但它比我能接触到的版本更早。你的测试代码将是一个很好的测验题!

© www.soinside.com 2019 - 2024. All rights reserved.