首页 > 解决方案 > 具有多个条件的 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 OR B=2 应该选择 N=100 的子集,其中 A=2 或 B=2。因此,选择的 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);

谢谢你。

标签: saswhere

解决方案


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

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

来自文档使用逻辑运算符组合表达式

处理复合表达式

当 SAS 遇到复合 WHERE 表达式(多个条件)时,软件会按照规则确定每个表达式的求值顺序。组合 WHERE 表达式时,SAS 以特定顺序处理条件:

  1. NOT 表达式首先被处理。
  2. 然后处理由 AND 连接的表达式。
  3. 最后,处理由 OR 连接的表达式。

使用括号控制评估顺序

即使 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);

这是相同的(根据逻辑分配律

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

无论你如何陈述表达式,添加一个OR总是有可能增加满足表达式的项目数。未嵌套的OR将有可能选择比嵌套(或括号化)更多的项目OR


推荐阅读