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统计)
用你的示例数据验证
你的示例表数据:
| id | item | type | status | date |
|---|---|---|---|---|
| 1 | A | 1 | P | 2018-04-01 |
| 2 | B | 2 | A | 2018-01-01 |
| 3 | C | 1 | A | 2018-01-02 |
| 4 | D | 2 | A | 2018-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
相关产品推荐
相关产品推荐

