如何解决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
相关产品推荐
相关产品推荐

