2

我有一个表 A,其结构如下:

ID   Name  City  zip

1    xxx   wer   134

2    yyy   qwe   234

3    zzz   ert   256

4    www   qwe   567

现在我想用一个 SQL 查询更新多行。例如查询:

UPDATE A
   SET zip= '355'
   WHERE id= '2';

将更新一行,如果我还想通过一个查询更新 ID 为 1 和 4 的行,ZIP 不同的地方怎么办?

4

3 回答 3

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')。

如果您有很多不同的值,那么我建议您创建一个参考数据表并从此表中选择一个作为更新语句中的子查询。

于 2013-10-24T12:10:26.663 回答
2

请尝试使用不同的值更新案例条件:

UPDATE A 
 SET zip=case when ID='1' then 'Value1' else 'Value2' end 
WHERE ID IN ('1', '4');
于 2013-10-24T12:11:41.543 回答
2

假设为给定 ID 找到正确 ZIP 的逻辑在您的客户端代码中,您可以动态生成一个匿名块,并在那里打包适当的更新,如下所示:

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;

(注意:在实际代码中使用绑定参数。)

这将在到服务器的单次往返中执行,但包含大量(文本)开销。如果您需要更新大量的行,请考虑数组绑定(如果您的客户端库可用)。

于 2013-10-24T12:33:46.660 回答