PostgreSQL中ANY与ALL查询小数据集出现异常结果的问询
PostgreSQL中
!= ANY与!= ALL的查询逻辑差异解析 场景与查询结果
基础数据集
执行select machine_name from fdr.machine_info;返回结果:K318、K319、K320、K321
四个查询的执行结果
- 查询1:
select machine_name from fdr.machine_info where machine_name = ANY (ARRAY['K319','K318']);→ 返回K318、K319 - 查询2:
select machine_name from fdr.machine_info where machine_name != ANY (ARRAY['K319','K318']);→ 返回全量数据集(不符合预期) - 查询3:
select machine_name from fdr.machine_info where machine_name = ALL (ARRAY['K319','K318']);→ 无返回结果 - 查询4:
select machine_name from fdr.machine_info where machine_name != ALL (ARRAY['K319','K318']);→ 返回K320、K321(符合预期)
逻辑差异解析
= ANY的运行逻辑
= ANY(数组) 对应逻辑或(OR):只要字段值和数组中任意一个元素相等,条件即成立。比如K318匹配数组中的'K318'、K319匹配'K319',所以这两条被筛选出来。
!= ANY的运行逻辑
!= ANY(数组) 同样是逻辑或(OR):只要字段值和数组中任意一个元素不相等,条件就成立。这就是查询2返回全量数据的原因:
- K318和数组中的'K319'不相等,满足条件;
- K319和数组中的'K318'不相等,满足条件;
- K320、K321和数组中两个元素都不相等,自然满足条件。
所有数据都符合筛选要求,因此返回全量结果。
= ALL的运行逻辑
= ALL(数组) 对应逻辑与(AND):字段值必须和数组中所有元素都相等,条件才成立。没有机器名能同时等于'K319'和'K318',所以查询3无结果。
!= ALL的运行逻辑
!= ALL(数组) 对应逻辑与(AND):字段值必须和数组中所有元素都不相等,条件才成立。也就是排除数组内的所有元素,因此K320、K321符合要求,返回正确结果。
内容的提问来源于stack exchange,提问作者Max Buckethead
相关产品推荐
相关产品推荐

