SQL Server中如何通过条件判断按规则迁移列值到对应列
解决方案
SQL Server中做逐行条件判断、将列值按规则拆分到不同目标列时,不需要使用批处理/存储过程里的IF...ELSE流控制语句,直接用CASE表达式即可,逻辑和你写的伪代码完全匹配。
实现代码
假设你的原表名为ArticleData,执行如下查询即可得到你期望的结果:
SELECT Article, [Desc.], -- UM为PC时取Value值,否则返回NULL CASE WHEN UM = 'PC' THEN Value END AS [Value PC], -- UM为CT时取Value值,否则返回NULL CASE WHEN UM = 'CT' THEN Value END AS [ValueCT] FROM ArticleData;
注意:SQL Server中如果列名包含空格、特殊符号或者和关键字重名(比如你这里的
Desc.、Value PC),必须用方括号[]包裹标识符,否则会报语法错误。
逻辑对应说明
CASE表达式的执行逻辑和你写的伪代码一一对应:
- 伪代码中
if UM = 'PC' then 移动值到"Value PC"列的逻辑,对应第一个CASE分支:逐行校验UM字段,值为PC时返回当前行的Value字段内容,不满足条件时默认返回NULL - 伪代码中
else 移动值到"Value CT"列的逻辑,对应第二个CASE分支:逐行校验UM字段,值为CT时返回当前行的Value字段内容,不满足条件时默认返回NULL
结果验证
上述查询返回的结果和你给出的期望输出完全一致:
| Article | Desc. | Value PC | ValueCT |
|---|---|---|---|
| Item1 | Flower | 5001 | NULL |
| Item2 | Paper | 6001 | NULL |
| Item2 | Paper | NULL | 6002 |
| Item3 | Pen | NULL | 7001 |
| Item4 | Eraser | 8001 | NULL |
补充提示
- 如果需要把查询结果持久化为新表,只需要在
FROM子句前加INTO 新表名即可,例如INTO ArticleValueSplit - 如果后续UM字段新增了其他枚举值,只需要对应增加新的
CASE分支列即可,不需要修改现有逻辑 - 注意区分场景:
IF...ELSE是控制整个T-SQL批处理执行路径的流控制语法,不适合做逐行的字段值计算,这类场景用CASE的执行效率和易用性都高很多。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

