如何在postgresql中更新表

时间:2017-01-22 10:10:23

标签: sql postgresql

我有一个以下格式的表格:

time                  year   month   day   hour   area   state1    state3 
2015-04-01 00:00:00   2015     4      1      0      1     100        300
2015-04-01 00:00:00   2015     4      1      0      2     300        300
2015-04-01 00:00:00   2015     4      1      0      3     500        600
2015-04-01 01:00:00   2015     4      1      0      1     600        900
2015-04-01 01:00:00   2015     4      1      0      2     100        300
2015-04-01 01:00:00   2015     4      1      0      3     100        600 
2015-04-01 02:00:00   2015     4      1      0      2     900        300
2015-04-01 02:00:00   2015     4      1      0      3     300        900
2015-04-01 02:00:00   2015     4      1      0      1     100        300
.......................
...........
........
2015-04-30 23:00:00   2015     4      30      23    3     100        300

问题是在2015-04-10 00:00:00之后我的所有记录在state1和state3都有0。所以我想用150到300之间的随机数更新那些。

我有一个返回随机数的函数。

SELECT random_between(1,100)
FROM generate_series(1,5);

如何使用我的函数更新2015-04-10 00:00:00之后的state1和state3。非常感谢。

1 个答案:

答案 0 :(得分:2)

以下面的会话为例。这是你想要做的一个非常简单的例子,也许它可以适应你的情况。我使用了直接演员和功能:

> createdb test
> psql -d test
psql (9.4.9)
Type "help" for help.

test=# create table mytest(id integer, cola integer,colb integer);
CREATE TABLE
test=# select * from mytest;
 id | cola | colb 
----+------+------
(0 rows)

test=# insert into mytest values(1,0,0);
INSERT 0 1
test=# insert into mytest values(2,0,0);
INSERT 0 1
test=# insert into mytest values(3,0,0);
INSERT 0 1
test=# insert into mytest values(4,0,0);
INSERT 0 1
test=# select * from mytest;
 id | cola | colb 
----+------+------
  1 |    0 |    0
  2 |    0 |    0
  3 |    0 |    0
  4 |    0 |    0
(4 rows)

test=# update mytest set cola = cast(((random()*150)+150) as Integer) where id >2;
UPDATE 2
test=# select * from mytest;
 id | cola | colb 
----+------+------
  1 |    0 |    0
  2 |    0 |    0
  3 |  178 |    0
  4 |  198 |    0
(4 rows)

test=# create function myrand()
test-# returns integer as $i$
test$# declare i integer;
test$# begin
test$# return cast(((random()*150)+150) as Integer);
test$# end; 
test$# $i$ language plpgsql;
CREATE FUNCTION

test=# update mytest set colb = myrand() where id >2;
UPDATE 2
test=# select * from mytest;
 id | cola | colb 
----+------+------
  1 |    0 |    0
  2 |    0 |    0
  3 |  178 |  201
  4 |  198 |  291
(4 rows)