mysql怎么写逻辑比较清晰?

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(公共表表达式)。下面是一个实现方案:
 

使用 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;

  

关键点解释

  1. CTE 预处理比较结果:
    • 首先计算 col1 与其他列的差值百分比,生成 use_col1_over_colX 标志,使主查询逻辑更清晰。
  2. 嵌套 CASE 逻辑:
    • 外层 CASE:判断 col1 是否为空,若为空则按顺序使用后续列。
    • 内层 CASE:当 col1 不为空时,依次检查 col2 到 col6 是否存在,并比较差值是否在 30% 以内。
  3. 百分比计算:
    • 使用 ABS(col1 - colX) / colX <= 0.3 判断差值是否在正负 30% 范围内。
    • 若 colX 为 0,该表达式会返回 NULL,需确保数据中不存在此类情况,或添加额外处理。
  1. 性能考虑:
    • 对于大量数据,可考虑在 CTE 中提前过滤掉不需要的行,减少计算量。
posted @ 2025-07-28 16:45  一叶知秋。  阅读(3)  评论(0)    收藏  举报