惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
S
SegmentFault 最新的问题
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
DataBreaches.Net
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
宝玉的分享
宝玉的分享
腾讯CDC
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
T
The Exploit Database - CXSecurity.com
T
The Blog of Author Tim Ferriss
V
V2EX
S
Securelist
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Y
Y Combinator Blog
P
Proofpoint News Feed
T
Tor Project blog
AWS News Blog
AWS News Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
博客园 - 聂微东
T
Threat Research - Cisco Blogs
B
Blog
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
N
News and Events Feed by Topic
博客园 - 司徒正美
H
Help Net Security
C
Cisco Blogs
C
Check Point Blog
S
Secure Thoughts

博客园 - 一叶知秋。

从包含时间属性的对象列表中,筛选出时间≤指定时间参数且最接近该时间参数的那个对象 安装nginx和OpenSSL struts2的<s:if test>标签的注意点 设置idea 代码报错时不弹框显示 Collections.sort多个字段排序 LigerUI 中的 Grid (ligerGrid) 合并单元格 mysql模糊查找数据库使用的字段名 spring RestTemplate忽略证书验证 关于easyExcel解析未添加@ExcelProperty报错问题分析 Nginx的常用命令(启动重启停止等) 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException报错 msyql查询表的索引sql语句 MySQL查看表占用空间大小 js屏蔽回车提交 kettle同步表数据null处理 MySql 分组后获取距离时间最近的第一条数据 mysql解表和查看锁表 Windows关闭指定端口命令 Windows 技术篇-防火墙启用时指定外部可访问端口,防火墙开放端口设置
mysql怎么写逻辑比较清晰?
一叶知秋。 · 2025-07-28 · via 博客园 - 一叶知秋。

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;
  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 中提前过滤掉不需要的行,减少计算量。