我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以像下面这样做?
UPDATE table
SET
column_a = 1 where column_b = '123',
column_a = 2 where column_b = '345'
我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以像下面这样做?
UPDATE table
SET
column_a = 1 where column_b = '123',
column_a = 2 where column_b = '345'
当前回答
是的,你可以:
UPDATE foobar SET column_a = CASE
WHEN column_b = '123' THEN 1
WHEN column_b = '345' THEN 2
END
WHERE column_b IN ('123','345')
并工作证明:http://sqlfiddle.com/#!2/97c7ea / 1
其他回答
是的,你可以:
UPDATE foobar SET column_a = CASE
WHEN column_b = '123' THEN 1
WHEN column_b = '345' THEN 2
END
WHERE column_b IN ('123','345')
并工作证明:http://sqlfiddle.com/#!2/97c7ea / 1
你也可以使用update…从语法和使用映射表。如果你想要更新多个列,它是更一般化的:
update test as t set
column_a = c.column_a
from (values
('123', 1),
('345', 2)
) as c(column_b, column_a)
where c.column_b = t.column_b;
你可以添加任意多的列:
update test as t set
column_a = c.column_a,
column_c = c.column_c
from (values
('123', 1, '---'),
('345', 2, '+++')
) as c(column_b, column_a, column_c)
where c.column_b = t.column_b;
SQL演示
除了其他答案、注释和文档之外,数据类型转换还可以放在使用上。这允许更容易的复制粘贴:
update test as t set
column_a = c.column_a::number
from (values
('123', 1),
('345', 2)
) as c(column_b, column_a)
where t.column_b = c.column_b::text;
要在单个查询中更新多行,您可以尝试这样做
UPDATE table_name
SET
column_1 = CASE WHEN any_column = value and any_column = value THEN column_1_value end,
column_2 = CASE WHEN any_column = value and any_column = value THEN column_2_value end,
column_3 = CASE WHEN any_column = value and any_column = value THEN column_3_value end,
.
.
.
column_n = CASE WHEN any_column = value and any_column = value THEN column_n_value end
如果你不需要额外的条件,那么删除这个查询的一部分
@zero323提供的答案在Postgre 12上很有效。如果有人对column_b有多个值(在OP的问题中引用)
UPDATE conupdate SET orientation_status = CASE
when id in (66934, 39) then 66
when id in (66938, 49) then 77
END
WHERE id IN (66934, 39, 66938, 49)
在上面的查询中,id类似于column_b;Orientation_status类似于问题的column_a。