在这个例子中可以组合UPDATE语句吗?

时间:2012-06-27 08:25:39

标签: sql tsql sql-server-2008-r2

我经常有如下代码行:

    UPDATE my_table SET name = 'x'  WHERE Original =  'a'
    UPDATE my_table SET name = 'y' WHERE Original =  'b' 
    UPDATE my_table SET name = 'z' WHERE Original = 'c'  
    UPDATE my_table SET name = 'k' WHERE Original = 'd' 
    UPDATE my_table SET name = 'm' WHERE Original = 'e'  
    UPDATE my_table SET name = 'n' WHERE Original = 'f' 

我可以将此代码合并/缩短为一个UpDate语句 - 或者它们是否最好保留原样?

3 个答案:

答案 0 :(得分:4)

UPDATE my_table 
SET name = 
    CASE 
        WHEN Original = 'a' THEN 'x' 
        WHEN Original = 'b' THEN 'y' 
        ... 
    END

这会更新每一行。因此,如果您没有指定原始值,则将其设置为NULL。因此,您可能希望使用WHERE子句将更新限制为您想要更新的更新,如下所示:

WHERE Original IN ('a', 'b', ...)

OR,作为替代方法,您可以使用ELSE语句,如果在WHEN语句中没有匹配项,则保留名称值,如下所示:

    CASE 
        WHEN Original = 'a' THEN 'x' 
        WHEN Original = 'b' THEN 'y' 
        ... 
        ELSE name
    END

答案 1 :(得分:4)

您可以使用case声明:

UPDATE  my_table 
SET     name = 
        case Original
        when 'a' then 'x'
        when 'b' then 'y'
        ...
        else name -- Preserve original
        end

else子句可确保您在name中未匹配case时修改{{1}}。

答案 2 :(得分:1)

如果这些值不在表格中,您可以使用table value constructor和from子句:

update mt set name = t.name
from
    my_table mt
        inner join
    (values
        ('a','x'),
        ('b','y'),
        ('c','z'),
        ('d','k'),
        ('e','m'),
        ('f','n')
    ) t(original,name)
        on
            mt.Original = t.original