0

我经常有如下代码行:

    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 语句中吗?还是最好将它们保持原样?

4

3 回答 3

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', ...)

或者,作为替代方案,您可以使用 ELSE 语句,如果在 WHEN 语句中没有匹配项,则保留 name 值不变,如下所示:

    CASE 
        WHEN Original = 'a' THEN 'x' 
        WHEN Original = 'b' THEN 'y' 
        ... 
        ELSE name
    END
于 2012-06-27T08:27:35.937 回答
4

您可以使用以下case语句:

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

else子句确保您不会修改 aname如果它在case.

于 2012-06-27T08:28:43.930 回答
1

如果这些值尚未在表中,则可以使用表值构造函数和 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
于 2012-06-27T08:38:25.460 回答