SQL中CASE WHEN处理正负数值范围判断错误的修复方案
问题修复方案
你的问题出在默认假设了NM.Min <= NM.Max,但当两者为负值且顺序颠倒时(比如NM.Min=-10、NM.Max=-100),实际有效区间是-100 <= 值 <= -10,原条件NM.Min <= TT._VALUE <= NM.Max就变成-10 <= -90 <= -100,显然不成立,导致误判。
以下是两种修复方式:
方法1:使用LEAST和GREATEST函数(推荐)
直接取两个值中的较小值作为区间下限,较大值作为上限,用BETWEEN简化判断:
CASE WHEN TT._VALUE BETWEEN LEAST(NM.Min, NM.Max) AND GREATEST(NM.Min, NM.Max) THEN 1 ELSE 0 END AS Min_max_Status
如果更习惯显式逻辑,也可以拆写成:
CASE WHEN (TT._VALUE >= LEAST(NM.Min, NM.Max)) AND (TT._VALUE <= GREATEST(NM.Min, NM.Max)) THEN 1 ELSE 0 END AS Min_max_Status
注:LEAST()返回参数中的最小值,GREATEST()返回最大值,主流数据库(MySQL、PostgreSQL、SQL Server 2022+等)都支持这两个函数。
方法2:嵌套CASE判断边界顺序
如果你的数据库不支持LEAST/GREATEST,可以先判断NM.Min和NM.Max的大小,再选择对应的区间条件:
CASE WHEN NM.Min <= NM.Max THEN CASE WHEN TT._VALUE BETWEEN NM.Min AND NM.Max THEN 1 ELSE 0 END ELSE CASE WHEN TT._VALUE BETWEEN NM.Max AND NM.Min THEN 1 ELSE 0 END END AS Min_max_Status
内容的提问来源于stack exchange,提问作者emrebalci
相关产品推荐
相关产品推荐

