SQL Server Update列基于存储在另一列中的SQL

时间:2017-02-14 11:18:25

标签: sql sql-server

我有2个SQL表,其中一个表包含源列和目标列,另一个表包含源值的转换逻辑。我需要应用转换逻辑并更新目标列。

表1

ID | PreVal |PostVal
1  |   5    | 
1  |   6    | 
1  |   7    | 
2  |   10   | 
2  |   15   | 

表2 - 转换逻辑

ID | Logic
1  |   case when PreVal < 6 then 1 else 0 end
2  |   case when PreVal < 12 then 1 else 0 end

通过连接两个表(而不是通过遍历游标中的每个ID构建动态SQL)来实现以下输出,是否可以只有一个公共更新语句

ID | PreVal |PostVal
1  |   5    | 1
1  |   6    | 0
1  |   7    | 0
2  |   10   | 1
2  |   15   | 0

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

将您的逻辑放入正式表中,然后加入:

UPDATE t1
SET PostVal = CASE WHEN t1.PreVal < t2.PreVal
                   THEN t2.positive ELSE t2.negative END
FROM Table1 t1
INNER JOIN
(
    SELECT 1 AS ID, 6 AS PreVal, 1 AS positive, 0 AS negative
    UNION ALL
    SELECT 2, 12, 1, 0
) t2
    ON t1.ID = t2.ID

答案 1 :(得分:0)

你可以尝试类似的东西:

Boolean.FALSE

查询列允许您使用不同的逻辑。

答案 2 :(得分:0)

如果转换逻辑太复杂,如:

1 case when PreVal < 6 then 1 else 0 end
2 case when PreVal = 0 then 1 else 2 end
3 case when PreVal > 1000 then 0 else 1 end
4 case when PreVal = 1 then 1 else 2 end 

然后我相信你无能为力。

在那种情况下,我会跑:

select distinct
    'update table1 set PostVal = ' + b.Logic + ' where Id = ' + convert (varchar(10), a.id)
from
    table1 a
    inner join table2 b on ( a.id = b.id )  

为每一行生成更新语句并按段运行。