如何比较两列取最小值且忽略零值(两列均为零除外)
解决两列取最小值时忽略零值(仅两列均为零时保留零)的SQL问题
问题场景
需要对比数据表中Unit value和Unit Ext value两列,获取最小值,规则如下:
- 忽略两列中的零值,仅当两列均为零时保留零值
- 处理NULL值,两列均为NULL时返回NULL
原数据表:
Id Unit value Unit Ext value 1 0 12 2 15 10 3 8 25 4 15 15 5 0 0 6 4 0 7 Null Null
期望结果:
Id Unit value Unit Ext value min value 1 0 12 12 2 15 10 10 3 8 25 8 4 15 15 15 5 0 0 0 6 4 0 4 7 Null Null Null
原查询语句的问题
原CASE语句未处理零值过滤逻辑,当其中一列是0时会直接返回0,导致ID=1和ID=6的行结果错误:
case when unitvalue<Unit Ext value then Unit value when unitvalue>Unit Ext then Unit Ext value end min value
正确解决方案
通过NULLIF将0转换为NULL,结合LEAST函数忽略NULL取最小值,同时单独处理两列均为0的特殊情况:
SELECT Id, `Unit value`, `Unit Ext value`, CASE WHEN `Unit value` = 0 AND `Unit Ext value` = 0 THEN 0 ELSE LEAST(NULLIF(`Unit value`, 0), NULLIF(`Unit Ext value`, 0)) END AS `min value` FROM your_table_name;
逻辑说明
NULLIF(col, 0):将列中的0替换为NULL,让LEAST函数计算时自动忽略这些零值LEAST(a, b):返回两值中的较小值,若其中一个为NULL则返回非NULL值;两值均为NULL时返回NULL- 外层CASE优先判断两列是否均为0,这种场景直接返回0,确保规则生效
内容的提问来源于stack exchange,提问作者Mike Swift
相关产品推荐
相关产品推荐

