SQL实现两数值区间就近取整(取下边界值)的查询编写需求
等级匹配SQL实现方案
前提假设
你的数据表命名为level_mapping,包含两个字段:
boundary_val:数值类型,存储各等级对应的边界值(原数据中的逗号统一替换为小数点存储,例如34,14改为34.14)level:字符串类型,存储边界值对应的等级,例如A+、A++
用户输入的待匹配数值用变量@input_val表示,本次示例取值为34.26
实现SQL(兼容MySQL 8.0+/PostgreSQL/SQL Server等支持CTE的数据库)
-- 赋值用户输入值 SET @input_val = 34.26; WITH -- 取上边界:大于输入值的最小边界及对应等级 upper_bound AS ( SELECT boundary_val, level FROM level_mapping WHERE boundary_val > @input_val ORDER BY boundary_val ASC LIMIT 1 ), -- 取下边界:小于输入值的最大边界及对应等级 lower_bound AS ( SELECT boundary_val, level FROM level_mapping WHERE boundary_val < @input_val ORDER BY boundary_val DESC LIMIT 1 ) SELECT CASE -- 输入值小于所有边界,直接返回最小边界对应等级 WHEN lower_bound.boundary_val IS NULL THEN upper_bound.level -- 输入值大于所有边界,直接返回最大边界对应等级 WHEN upper_bound.boundary_val IS NULL THEN lower_bound.level -- 输入值大于上下边界平均值,返回上边界等级 WHEN @input_val > (lower_bound.boundary_val + upper_bound.boundary_val)/2 THEN upper_bound.level -- 输入值小于等于平均值,返回下边界等级 ELSE lower_bound.level END AS matched_level FROM lower_bound CROSS JOIN upper_bound;
如果你使用的是不支持CTE的低版本数据库,可以把子查询直接放到FROM子句中,逻辑完全一致。
结果验证
针对本次示例:
- 下边界值为
34.14,对应等级A+ - 上边界值为
34.42,对应等级A++ - 平均值为
(34.14+34.42)/2 = 34.28 - 输入值
34.26小于34.28,最终返回等级A+,符合规则要求
内容的提问来源于stack exchange,提问作者zdnmn
相关产品推荐
相关产品推荐

