更新具有不同条件的不同值的表

时间:2017-03-28 21:06:49

标签: sql sql-server sql-update

我有这样的情况:

update lskinproperty
set frn_lskin_stateid = 2
where frn_lskinid IN (61209, 61208)

update lskinproperty
set frn_lskin_stateid = 3
where frn_lskinid IN (72670, 56916)

update lskinproperty
set frn_lskin_stateid = 4
where frn_lskinid IN (55451)

如果我运行这三个查询,它将完全按照我的要求行事,但我觉得它应该是一个更好的方法来做到这一点。 SQL Server是否有类似case或switch之类的东西,你可以说等于x的情况这样做,对于等于y的情况做其他事情等等吗?

2 个答案:

答案 0 :(得分:1)

您可以一次过滤frn_lskinid的所有值,然后使用case来确定要为哪个frn_lskinid指定的值。

update lskinproperty
set frn_lskin_stateid = case 
        when frn_lskinid in (61209, 61208)
            then 2
        when frn_lskinid in (72670, 56916)
            then 3
        else 4
        end
where frn_lskinid in (72670, 56916, 61209, 61208, 55451)

此处的else涵盖frn_lskinid为55451的情况,与使用其他when明确写入的情况相同:

update lskinproperty
set frn_lskin_stateid = case 
        when frn_lskinid in (61209, 61208)
            then 2
        when frn_lskinid in (72670, 56916)
            then 3
        when frn_lskinid = 55451
            then 4
        end
where frn_lskinid in (72670, 56916, 61209, 61208, 55451)

答案 1 :(得分:1)

进行此类更新可能没有真正的捷径。使用case强制您提供id两次:一次在case子句中,然后再次在where子句中。但是,如果您要以表格方式更改值,则可以执行以下操作:

update tbl set frn_lskin_stateid=st
from (       select 61209 i,2 st
   union all select 61208,2
   union all select 72670,3
   union all select 56916,3
   union all select 55451,4 ) tvalues
inner join lskinproperty tbl on frn_lskinid=i;

在实际应用中,tvalues很可能是包含目标值的表格,当然,您也可以在子查询中提供具有多条union all行的值,如上所示

有关演示,请参阅此处:http://rextester.com/NDQGL19748