mysql怎么写逻辑比较清晰?
若(1)不为空,则比较(1)和(2)的差值,小于正负30%,则使用(1),否则使用(2);若(2)为空,则比较(1)和(3)的差值,小于正负30%,则使用(1),否则使用(3);若(3)为空,则比较(1)和(4)的差值,小于正负30%,则使用(1),否则使用(4);若(4)为空,则比较(1)和(5)的差值,小于正负30%,则使用(1),否则使用(5);若(5)为空,则比较(1)和(6)的差值,小于正负30%,则使用(1),否则使用(6)。
在 MySQL 中,可以使用嵌套的 CASE 语句结合条件判断来实现这个复杂的逻辑。为了让逻辑更加清晰,建议将各个步骤拆分成子查询或者使用 CTE(公共表表达式)。下面是一个实现方案:
WITH value_comparison AS (
SELECT
col1, col2, col3, col4, col5, col6,
-- 判断 col1 和 col2 的差值是否在正负30%以内
CASE
WHEN col2 IS NOT NULL AND col1 IS NOT NULL
THEN ABS(col1 - col2) / col2 <= 0.3
ELSE NULL
END AS use_col1_over_col2,
-- 判断 col1 和 col3 的差值是否在正负30%以内
CASE
WHEN col3 IS NOT NULL AND col1 IS NOT NULL
THEN ABS(col1 - col3) / col3 <= 0.3
ELSE NULL
END AS use_col1_over_col3,
-- 判断 col1 和 col4 的差值是否在正负30%以内
CASE
WHEN col4 IS NOT NULL AND col1 IS NOT NULL
THEN ABS(col1 - col4) / col4 <= 0.3
ELSE NULL
END AS use_col1_over_col4,
-- 判断 col1 和 col5 的差值是否在正负30%以内
CASE
WHEN col5 IS NOT NULL AND col1 IS NOT NULL
THEN ABS(col1 - col5) / col5 <= 0.3
ELSE NULL
END AS use_col1_over_col5,
-- 判断 col1 和 col6 的差值是否在正负30%以内
CASE
WHEN col6 IS NOT NULL AND col1 IS NOT NULL
THEN ABS(col1 - col6) / col6 <= 0.3
ELSE NULL
END AS use_col1_over_col6
FROM your_table
)
SELECT
CASE
-- 若 col1 不为空,优先处理 col1
WHEN col1 IS NOT NULL THEN
CASE
WHEN col2 IS NOT NULL THEN
CASE
WHEN use_col1_over_col2 THEN col1
ELSE col2
END
WHEN col3 IS NOT NULL THEN
CASE
WHEN use_col1_over_col3 THEN col1
ELSE col3
END
WHEN col4 IS NOT NULL THEN
CASE
WHEN use_col1_over_col4 THEN col1
ELSE col4
END
WHEN col5 IS NOT NULL THEN
CASE
WHEN use_col1_over_col5 THEN col1
ELSE col5
END
WHEN col6 IS NOT NULL THEN
CASE
WHEN use_col1_over_col6 THEN col1
ELSE col6
END
ELSE col1 -- 若只有 col1 不为空,直接使用 col1
END
-- 若 col1 为空,则依次检查后续列
WHEN col2 IS NOT NULL THEN col2
WHEN col3 IS NOT NULL THEN col3
WHEN col4 IS NOT NULL THEN col4
WHEN col5 IS NOT NULL THEN col5
ELSE col6 -- 若所有列都为空,返回 col6(可能为 NULL)
END AS final_value
FROM value_comparison;
-
CTE 预处理比较结果:
- 首先计算
col1 与其他列的差值百分比,生成 use_col1_over_colX 标志,使主查询逻辑更清晰。
-
嵌套 CASE 逻辑:
- 外层 CASE:判断
col1 是否为空,若为空则按顺序使用后续列。
- 内层 CASE:当
col1 不为空时,依次检查 col2 到 col6 是否存在,并比较差值是否在 30% 以内。
-
百分比计算:
- 使用
ABS(col1 - colX) / colX <= 0.3 判断差值是否在正负 30% 范围内。
- 若
colX 为 0,该表达式会返回 NULL,需确保数据中不存在此类情况,或添加额外处理。
-
性能考虑:
- 对于大量数据,可考虑在 CTE 中提前过滤掉不需要的行,减少计算量。