求助:将指定Excel条件公式转换为对应SQL查询条件语句
Excel条件判断逻辑转SQL实现方案
原始逻辑梳理
- 原Excel计算公式:
=IF(OR(C9="",D9=""),"",IF(C9>0,D9-0.00005,D9+0.00005))
- 逻辑拆解:
- 若C9、D9任意一个为空,直接返回空值
- 若C9大于0,返回D9减0.00005的计算结果
- 其余情况(C9小于等于0),返回D9加0.00005的计算结果
字段映射规则
- C9对应派生字段C1:当
TCLASS<>3 且 INDBS=83时取DP字段值,当TCLASS<>3 且 INDBS=66时取DPS字段值,不满足两个条件时C1为空 - D9直接对应数据库表字段
DRATE
可用SQL代码
基础写法(无嵌套)
直接在SELECT层嵌套判断逻辑,无需额外子查询,适配大部分SQL引擎:
SELECT -- 可在此处追加其他需要查询的业务字段 CASE WHEN (CASE WHEN TCLASS <> 3 AND INDBS = 83 THEN DP WHEN TCLASS <> 3 AND INDBS = 66 THEN DPS END) IS NULL OR DRATE IS NULL THEN NULL WHEN (CASE WHEN TCLASS <> 3 AND INDBS = 83 THEN DP WHEN TCLASS <> 3 AND INDBS = 66 THEN DPS END) > 0 THEN DRATE - 0.00005 ELSE DRATE + 0.00005 END AS calc_result FROM 你的业务表名 -- 可在此处追加业务过滤条件 ;
可读性优化写法(CTE提前派生C1字段)
如果需要重复使用C1字段,或者觉得嵌套写法可读性差,可以用CTE提前计算派生字段,逻辑更清晰:
WITH base_calc AS ( SELECT -- 可在此处追加其他需要查询的业务字段 DRATE, CASE WHEN TCLASS <> 3 AND INDBS = 83 THEN DP WHEN TCLASS <> 3 AND INDBS = 66 THEN DPS END AS C1 FROM 你的业务表名 -- 可在此处追加业务过滤条件 ) SELECT *, CASE WHEN C1 IS NULL OR DRATE IS NULL THEN NULL WHEN C1 > 0 THEN DRATE - 0.00005 ELSE DRATE + 0.00005 END AS calc_result FROM base_calc ;
注意事项
- 数值类型字段的空值判断统一用
IS NULL,不要用=''做判断,避免隐式类型转换导致的逻辑错误 - 如果业务场景中数值
0需要等同于空值处理,可以在WHEN判断条件中追加对应的判断逻辑 - 如果对计算结果精度有要求,可以在计算外层套
ROUND函数指定保留小数位数
内容的提问来源于stack exchange,提问作者sathishkumar Guggilla
相关产品推荐
相关产品推荐

