PostgreSQL筛选仅含PSC阶段运输编码的ANY运算符使用问题
问题原因分析
你原来的查询逻辑错误在于<> ANY(...)的语义:只要某行的tcs_stages_code不等于列表里的任意一个值,就会返回该行,最终会把所有存在PSC阶段的运输编码都返回,完全没有过滤掉同时存在其他阶段的编码。
可行解决方案
方案1:使用GROUP BY + 聚合过滤(最直观)
按运输编码分组,统计该编码下非PSC阶段的数量,如果为0则符合要求:
SELECT tcs_transportation_code FROM ( -- 这里替换为你获取原始数据的查询语句 'QUERY TO GET THE DATA SHOWN HERE' ) AS old_query GROUP BY tcs_transportation_code -- 非PSC阶段的数量为0,说明所有阶段都是PSC HAVING COUNT(*) FILTER (WHERE tcs_stages_code <> 'PSC') = 0;
如果你用的PostgreSQL版本支持布尔聚合,也可以用更简洁的写法:
SELECT tcs_transportation_code FROM ( 'QUERY TO GET THE DATA SHOWN HERE' ) AS old_query GROUP BY tcs_transportation_code HAVING bool_and(tcs_stages_code = 'PSC');
方案2:使用EXCEPT集合运算
先查所有存在PSC阶段的运输编码,再减去所有存在其他阶段的运输编码,剩下的就是仅含PSC的编码:
SELECT tcs_transportation_code FROM old_query WHERE tcs_stages_code = 'PSC' EXCEPT SELECT tcs_transportation_code FROM old_query WHERE tcs_stages_code <> 'PSC';
补充说明
你提供的示例数据中所有运输编码都存在PSC之外的其他阶段,所以执行上述查询返回的结果为空。
内容的提问来源于stack exchange,提问作者Archana Kumari
相关产品推荐
相关产品推荐

