我经常有如下代码行:
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语句 - 或者它们是否最好保留原样?
答案 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