我有一张表A,其结构如下:
ID Name City zip
1 xxx wer 134
2 yyy qwe 234
3 zzz ert 256
4 www qwe 567
现在我想用一个SQL查询更新多行。例如Query:
UPDATE A
SET zip= '355'
WHERE id= '2';
会更新一行,如果我还想用一个查询来更新ID为1和4的行,那么ZIP会有什么不同?
答案 0 :(得分:5)
如果您希望使用一个查询将多行更新为同一个zip,则可以使用以下命令:
UPDATE A
SET zip= '355'
WHERE id in ('1','4');
但是,如果你的意思是你想要将多行更新为zip值,那么如果没有一些逻辑坐在哪个id应该得到哪个zip,这就无法完成。例如,如果您想要执行一些不同的值,可以使用以下内容:
UPDATE A
SET zip= decode(id,'1','100','4','400')
WHERE id in ('1','4');
这会将id为'1'的任何行的zip设置为'100',将id为'4'的任何行设置为'400',依此类推。您可以根据需要添加任意数量的参数。如果您想要任何未列出的默认值,只需将其添加到最后,例如decode(id,'1','100','4','400','999')
会设置任何非id'1'或'4'(但不会在where语句中排除'999')。
如果你有很多不同的值,那么我建议你创建一个参考数据表,并从这个表中选择你的更新语句中的子查询。
答案 1 :(得分:2)
请尝试使用不同的值更新案例条件:
UPDATE A
SET zip=case when ID='1' then 'Value1' else 'Value2' end
WHERE ID IN ('1', '4');
答案 2 :(得分:2)
假设找到给定ID的正确ZIP的逻辑在您的客户端代码中,您可以动态生成匿名块,并在那里打包相应的UPDATE,如下所示:
BEGIN
UPDATE A SET zip= '255' WHERE id= '1';
UPDATE A SET zip= '355' WHERE id= '2';
UPDATE A SET zip= '455' WHERE id= '4';
END;
(注意:在实际代码中使用绑定参数。)
这将在服务器的单次往返中执行,但包含大量(文本)开销。如果您需要更新非常多的行,请考虑array binding(如果您的客户端库可用)。