聚合函数可传入条件?SQL语法差异及原理咨询
关于SUM函数中传入条件的SQL语法疑问解答
原写法的原理
你看到的SUM(gender = 'M')这种写法,本质是利用了部分SQL方言的布尔值隐式转数值特性:
- 当
gender = 'M'成立时,表达式返回true,这类数据库会自动把true当作1处理;不成立时返回false,当作0处理。 - SUM对这些1和0累加,就等价于统计该省份的男性患者数量,同理
SUM(gender = 'F')是统计女性数量,最后通过HAVING筛选出男性更多的省份。
这是特定SQL版本的特性吗?
是的,这种写法只在支持布尔值隐式转数值的数据库中生效,比如MySQL、PostgreSQL、SQLite等。而SQL Server不支持这种隐式转换,所以会报语法错误——在SQL Server里,gender = 'M'返回的是BIT类型(仅0或1),但SUM函数不能直接聚合BIT类型,必须显式转换为数值类型。
SQL Server的替代写法
要在SQL Server中实现同样逻辑,需要用CASE语句显式转换:
SELECT province_id FROM patients GROUP BY province_id HAVING SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) > SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END)
或者也可以用COUNT结合CASE:
SELECT province_id FROM patients GROUP BY province_id HAVING COUNT(CASE WHEN gender = 'M' THEN 1 END) > COUNT(CASE WHEN gender = 'F' THEN 1 END)
内容的提问来源于stack exchange,提问作者PeteyPablo
相关产品推荐
相关产品推荐

