我很确定之前会问这个问题,但我找不到答案,因为我不知道我应该搜索哪些条款。
我有一张桌子:
create table tmp_test (
id serial primary key,
value integer,
value_2 numeric
);
最初,我们可能会在表格中找到以下条目:
id value value_2
______________________
1 4 NULL
2 3 NULL
3 5 NULL
...
我已经提取了前两列,并完成了转换以获取第三列,现在我想更新tmp_table
,使其看起来像这样:
id value value_2
______________________
1 4 5.2
2 3 1.3
3 5 2.1
...
有没有办法一次完成所有操作,而不是遍历行并执行如下语句:
update tmp_table set value_2 = 5.2 where id = 1 and value = 4;
答案 0 :(得分:1)
这样做:
update tmp_table set value_2 = value_1 / 2.0;
这将立即更新所有行(因为没有where
子句)。另请注意,在value_2
作业的右侧,我们可以引用其他列(在本例中为value_1
列)。
答案 1 :(得分:1)
我假设您要将应用程序中计算的一组数字插入value_2
列。
使用两个数组,一个用于ids
,另一个用于values
:
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as value
id | value
----+-------
1 | 5.2
2 | 1.3
3 | 2.1
(3 rows)
使用主键识别值并使用上述查询更新表:
update tmp_test t
set value_2 = n.val
from (
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as val
) n
where t.id = n.id;
select * from tmp_test;
id | value | value_2
----+-------+---------
1 | 4 | 5.2
2 | 3 | 1.3
3 | 5 | 2.1
(3 rows)