具有多个条件的SAS WHERE语句

时间:2018-12-18 05:40:54

标签: sas where

在SAS PROC FREQ中,使用带有多个条件的WHERE语句,我想了解为什么添加条件会导致频率增加。

第一个实例:

PROC FREQ;
WHERE X=1 AND Y=1;
TABLE YEARS;
RUN;

输出特定年份的N = 100。

但是:

PROC FREQ;
WHERE (X=1 AND Y=1) AND A=2 OR B=2;
TABLE YEARS;
RUN;

输出的N值大于前一年的WHERE,例如N = 200。

在第二个FREQ和WHERE语句中,我认为应该首先对括号中的条件进行求值,然后再执行AND ... OR,并应选择与第一个WHERE语句相同的N = 100。然后,该行中的其余条件AND A = 2或B = 2,应选择A = 2或B = 2的N = 100的子集。因此,选择的N应该小于或等于100,但不大于100。

这就是我想要的-(X = 1 AND Y = 1)的子集 也有A = 2或B = 2--但似乎不是我要的。有建议吗?

这是我想要的正确说法吗?

WHERE (X=1 AND Y=1 AND A=2) OR (X=1 AND Y=1 AND B=2);

谢谢。

1 个答案:

答案 0 :(得分:3)

向逻辑表达式中添加未嵌套 OR总是会导致结果集保持不变或变大。

您需要括号来更改评估顺序。如果没有括号,将首先计算所有and表达式,然后计算or表达式

摘自文档Combining Expressions By Using Logical Operators

  

处理复合表达式

     

当SAS遇到化合物WHERE时   表达式(多种条件)时,软件遵循以下规则   确定评估每个表达式的顺序。何时何地   表达式组合在一起,SAS处理特定条件   订单:

     
      
  1. 首先处理NOT表达式。
  2.   
  3. 然后处理与AND连接的表达式。
  4.   
  5. 最后,处理由OR联接的表达式。
  6.   
     

使用括号控制评估顺序

     

即使SAS按特定顺序评估逻辑运算符,您也可以   通过将表达式嵌套在括号中来控制求值顺序。   也就是说,括号中的表达式在一个   没有封闭。括号内最里面的表达式   首先处理,然后再进行最深处理,向外移动直到   所有括号均已处理。

     

例如,假设您想要一个   同时具有SAS / GRAPH和SAS / STAT的所有加拿大站点的列表   软件,因此您发出以下表达式:

  where product='GRAPH' or product='STAT' and country='Canada';
     

但是,结果包括所有许可SAS / GRAPH软件的站点以及加拿大   许可SAS / STAT软件的站点。为了获得正确的结果,   您可以使用括号,这会使SAS评估比较   首先在括号内,提供包含以下内容的网站列表:   产品许可证,然后将结果用于剩余条件:

where (product='GRAPH' or product='STAT') and country='Canada';

所以你

WHERE (X=1 AND Y=1) AND A=2 OR B=2;

相同
WHERE (X=1 AND Y=1 AND A=2) OR B=2;

您的这就是我想要的在问题中描述的是

WHERE (X=1 AND Y=1) AND (A=2 OR B=2);

这是相同的(distributive law of logic

WHERE (X=1 AND Y=1 AND A=2) OR (X=1 AND Y=1 AND B=2);

无论您如何表达表达式,添加OR总是可以增加满足表达式的项目数量。未嵌套的OR可以选择比嵌套{或括号括起来的OR

更多的项目