You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中两个含CASE与WHERE子句的查询是否等价?

Are These Two SQL Queries Equivalent?

嘿,这两个查询确实是等价的!咱们来一步步拆解它们的逻辑,再用你给出的示例数据验证:

先看两个查询的核心逻辑

查询1的执行逻辑

Select count(case when type=1 and status='A' and date<'2018-04-01' then id) as type1, 
       count(case when type=2 and status='A' and date<'2018-04-01' then id) as type2 
FROM table
  • 它会扫描整个表的所有记录
  • 对每条记录,分别判断是否满足type=1/2 + status='A' + date<'2018-04-01'的组合条件
  • 只有条件满足时,case语句才会返回对应的id(非null值),count()函数只会统计非null的结果;不满足条件时case默认返回null,不会被计数

查询2的执行逻辑

Select count(case when type=1 then id) as type1, 
       count(case when type=2 then id) as type2 
FROM table 
where status='A' and date < '2018-04-01'
  • 它先通过WHERE子句提前过滤出所有满足status='A'且date<'2018-04-01'的记录
  • 再在这个过滤后的小数据集里,分别统计type=1和type=2的记录数(同样,case不满足时返回null,不被count统计)

用你的示例数据验证

你的示例表数据:

iditemtypestatusdate
1A1P2018-04-01
2B2A2018-01-01
3C1A2018-01-02
4D2A2018-04-11

满足status='A'且date<'2018-04-01'的记录是行2和行3:

  • 查询1的结果:type1=1(对应行3),type2=1(对应行2)
  • 查询2的结果:同样是type1=1,type2=1

小补充:执行效率差异

虽然结果完全一致,但查询2通常执行效率更高:因为WHERE子句提前过滤掉了不符合条件的记录(比如行1、行4),后续的count计算只在更小的数据集上进行,而查询1需要扫描全表。不过这只是性能上的区别,最终的返回结果是完全相同的。

内容的提问来源于stack exchange,提问作者John Wick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:00:18