我有这样的情况:
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的情况做其他事情等等吗?
答案 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