If statement 什么';sas9.4M6中where语句和if语句在处理字符方面的区别是什么

If statement 什么';sas9.4M6中where语句和if语句在处理字符方面的区别是什么,if-statement,sas,where-clause,If Statement,Sas,Where Clause,最近,我碰巧发现了一件有趣的事情: data test; set sashelp.class; if _N_ in (2 3 5 7) then name = ''; run; data test; set ; where name; run; 结果是:数据测试有15个观察值。 我使用SAS 9.4M6已经一年多了,我不记得wherestatment可以像布尔型变量一样处理字符型变量。我将where严格更改为if,结果是:name不是一个数字变量,数据测试的观

最近,我碰巧发现了一件有趣的事情:

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

data test;
    set ;
    where name;
run;
结果是:数据测试有15个观察值。

我使用SAS 9.4M6已经一年多了,我不记得
where
statment可以像布尔型变量一样处理字符型变量。我将
where
严格更改为
if
,结果是:name不是一个数字变量,数据测试的观察值为0。

这是我的两个问题:
1.是
其中的name另一种不缺少名称的
方式
?如果没有,在提交时会发生什么情况 2.SAS中何时允许使用这种代码(
where;


谢谢你的提示。

是的,这是对非空值的测试。我已经使用它很多年了,主要是在以交互方式浏览数据集时。我怀疑自从SAS引入WHERE语句,或者至少自从他们将其重新分解以使用与SQLWHERE子句相同的语法以来,它就已经存在了

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

所以如果你用

if name ;

在数据步骤中,您将看到有关SAS尝试将字符变量名转换为一个数字的说明,该数字可以计算为FALSE(缺失的零)或TRUE(任何其他值)。由于SASHELP.CLASS中的名称无法转换为数字,因此所有名称都将被视为FALSE。

有趣的发现!我也没有注意到这一点。我在9.4M4和9.4M5上都试过了,得到了相同的结果。这可能是比这更早添加的内容。我也没有看到关于它的文档。通过测试,我可以看到:

  • where
    语句可以自动将诸如
    if name
    之类的字符转换为布尔语句

  • if
    语句不会自动将字符转换为布尔值,并要求用户明确说明要排除的字符,例如

  • 代码:

    我不知道这是什么时候添加的,但它早于我可以访问的版本。您的测试代码将是一个很棒的问答题

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