case when语句增加_case when加条件

case when语句增加_case when加条件

编程文章jaq1232025-09-11 21:09:012A+A-

优化后的SQL语句

```sql

UPDATE a

SET chdefine2 = CASE

WHEN inserted.cInvCode = '808654' THEN '7' -- 新增条件:指定编码返回7

WHEN inserted.cInvCode IN ('708671','933871','5010600','5010601') THEN '1' -- 原逻辑保留

ELSE SUBSTRING(b.cInvCode, 1, 1) -- 原默认逻辑保留

END

FROM pu_appvouch_extradefine a

JOIN inserted ON a.id = inserted.id -- 关联临时表(触发器上下文)

JOIN PU_AppVouchs b ON inserted.id = b.ID -- 直接关联子表,减少冗余关联

WHERE EXISTS ( -- 确保主表关联存在,避免无效更新

SELECT 1 FROM PU_AppVouch

WHERE ID = inserted.id

);

```


优化说明

1. 新增条件优先执行

将 `inserted.cInvCode = '808654' THEN '7'` 作为 `CASE` 语句的第一个条件,确保优先匹配(`CASE` 语句按顺序匹配,一旦命中则不再执行后续条件)。


2. 简化表关联逻辑

- 移除冗余的 `PU_AppVouch` 直接关联,改用 `EXISTS` 子查询验证主表记录存在性,避免多表连接导致的性能损耗。

- 使用表别名(`a` 代表 `pu_appvouch_extradefine`,`b` 代表 `PU_AppVouchs`)提升可读性。


3. 明确字段归属

- `SUBSTRING(b.cInvCode, 1, 1)` 显式指定 `cInvCode` 来自 `PU_AppVouchs` 表(别名 `b`),避免字段歧义。


4. 保持原逻辑兼容性

原有的 `IN` 条件和默认截取逻辑完全保留,仅新增条件插入到 `CASE` 语句最前方,确保业务逻辑无变化。


注意事项

- 触发器上下文依赖:`inserted` 表是 SQL Server 触发器中的临时表,此语句需在触发器内执行才有效。

- 索引建议:若 `id` 字段(关联键)无索引,建议为 `PU_AppVouch.ID`、`PU_AppVouchs.ID`、`
pu_appvouch_extradefine.id` 创建索引,提升关联效率。

- 数据类型统一:确保 `chdefine2` 字段支持存储字符串 `'7'`、`'1'` 及截取后的单个字符(如 `'5'`、`'7'` 等),避免类型转换错误。

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21