如何将块中的转换数据插回到原始表中?

时间:2016-09-22 00:23:39

标签: postgresql postgresql-9.5

我很确定之前会问这个问题,但我找不到答案,因为我不知道我应该搜索哪些条款。

我有一张桌子:

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;

2 个答案:

答案 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)