case when语句增加_case when加条件
优化后的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'` 等),避免类型转换错误。
相关文章
- Shell中针对字符串的切片,截取,替换,删除,大小写操作
- Python学不会来打我(8)字符串string类型深度解析
- TS类型体操,看懂你就能玩转TS了_ts l
- 你只会用 split?试试 StringTokenizer,性能可以快 4 倍
- 2025-08-22:最短匹配子字符串。用go语言,给定两个字符串 s 和 p,
- case when语句增加_case when加条件
- 一次完整的HTTP请求与响应涉及了哪些知识?
- Excel超链接点击无反应及安全提示问题
- Java 判断对象是否所有属性为空,大家觉得这样写可以吗?
- Spring事物(@transactional注解)在什么情况下会失效,为什么?