sas - 具有多个条件的 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);
谢谢你。
解决方案
向逻辑表达式添加非嵌套 OR
总是会导致结果集保持不变或变大。
您需要括号来更改评估顺序。当没有括号时,and
首先计算所有表达式,然后计算or
表达式
来自文档使用逻辑运算符组合表达式
处理复合表达式
当 SAS 遇到复合 WHERE 表达式(多个条件)时,软件会按照规则确定每个表达式的求值顺序。组合 WHERE 表达式时,SAS 以特定顺序处理条件:
- NOT 表达式首先被处理。
- 然后处理由 AND 连接的表达式。
- 最后,处理由 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
推荐阅读
- jquery - 为什么使用editData从jqGrid向服务器方法发送附加数据失败
- java - JNI 函数是线程安全的吗?
- oauth-2.0 - SPA 调用 WebAPI 调用 WebAPI
- javascript - Vue-Firebase:从 firebase 捕获更改的值
- asp.net-mvc-5 - 如何根据角色更改重定向默认登录链接?
- android - 如何使用 Recyclerview 中单击的适配器的位置获取数据?
- python - 默认情况下具有类属性的奇怪 getattr() 行为
- angularjs - 带有Angularjs的Nodejs:未执行角度控制器脚本
- django - DJANGO_SETTINGS_MODULE 变量的取消配置(不可修复)
- java - 浮动字体大小在 OpenJDK 中不起作用