You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决SQL中CASE WHEN语句重复编写相同查询的问题

示例问题优化方案

你这段逻辑的核心需求是匹配到符合条件的工单就返回对应车牌,没有匹配结果就返回空格,完全不需要写两次重复的子查询,直接用ISNULL(SQL Server 适用,其他数据库可替换为COALESCE)包裹子查询即可实现相同逻辑,优化后代码如下:

SELECT
    ISNULL(
        (
            SELECT TOP 1 wo.licence_plate
            FROM work wo (NOLOCK)
            JOIN work_order ds ON wo.pk_id = ds.fk_work_order_id
            JOIN parameter par ON ds.status = par.code
            WHERE 
                par.parameter_group_id = 1246
                AND par.code = 5
                AND wo.customer_id = cus.pk_id
                AND wo.delivery_date > DATEADD(DAY, -7, GETDATE())
        ), ' '
    ) AS result
FROM customer cus

注:你原代码中EXISTS子查询的过滤条件写的是par.id=1246,THEN子查询里是par.parameter_group_id=1246,如果是笔误可统一参数,若为业务逻辑差异可按需调整。

SQL常用的避免重复编写查询的方案
  • 子查询复用:逻辑一致的取值、判断逻辑,统一封装为单个标量/表子查询,配合ISNULL/COALESCE/CASE WHEN直接使用返回结果,无需重复编写查询逻辑
  • CTE(公共表表达式):单条查询中多次用到的同一份数据集,可通过WITH语法定义为CTE,后续查询可反复引用,适合复杂多步查询的逻辑拆分
  • 视图封装:多个查询都会用到的表关联、固定过滤逻辑可以封装为视图,后续查询直接访问视图即可,不用重复写JOIN和过滤条件
  • 用户自定义函数:参数化的高频查询逻辑,可封装为标量函数或表值函数,调用时传入对应参数即可拿到结果,适合逻辑固定、参数可变的复用场景
  • 临时表/表变量:单次会话中多次用到的数据集,可先将结果存入临时表或表变量,后续操作直接读取临时表,既避免重复写查询,还能降低重复查询的性能开销
  • 窗口函数替代子查询:很多需要用子查询做判断、取值的场景,用ROW_NUMBER、MAX配合PARTITION BY等窗口函数可以直接在主查询层面完成逻辑,不需要额外写重复子查询

内容的提问来源于stack exchange,提问作者Kara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:01