SQL查询等价性疑问:GROUP BY中CASE WHEN与多列分组是否始终等效?
Q1与Q2是否始终等价?
结论:二者并不始终等价,差异主要出现在A不为NULL的场景下,具体分析如下:
两个查询的代码明确
Q1
select case when [A] is null then [B] else [A] end, sum([X]) from TABLE_ABX group by case when [A] is null then [B] else [A] end;
Q2
select case when [A] is null then [B] else [A] end, sum([X]) from TABLE_ABX group by [A], [B];
等价性拆解分析
当
A为NULL时
两者分组逻辑一致:Q1按B的值分组,Q2按(NULL, B)的组合分组,本质都是以B作为分组依据,此时两个查询的输出结果完全相同。当
A不为NULL时
Q1仅以A的值作为分组依据,所有A相同的行会被合并成一组求和;而Q2是以(A, B)的组合作为分组依据,哪怕A相同,只要B值不同,就会被拆分成不同的组单独计算sum(X)。举个实际数据的例子:
A B X 1 2 5 1 3 3 Q1的输出结果:
case结果 sum(X) 1 8 Q2的输出结果:
case结果 sum(X) 1 5 1 3 可见此时两者的输出完全不同。
综上,两个查询仅在A全为NULL的特殊场景下等价,并非始终等价。
内容的提问来源于stack exchange,提问作者Sean Visinoni
相关产品推荐
相关产品推荐

