如何在postgresql中创建条件插入函数?

tuwxkamq  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(381)

我试着写一个函数来插入一些值 column3 在我的表中基于这个表中的值,但是我不太熟悉在postgresql9.6中编写函数。

  1. --Create some table
  2. CREATE TABLE test(column1 INT, column2 INT, column3 TEXT)
  3. INSERT INTO test VALUES(-8020,15),(-200,1),(23,115)
  4. --Build function
  5. CREATE OR REPLACE FUNCTION new_function()
  6. RETURNS TEXT AS
  7. $$
  8. BEGIN
  9. IF test(column1) <= -7000 THEN INSERT INTO test(column3) VALUES('small');
  10. ELSIF test(column1) >= -7000 AND test(column2) <= 15 THEN INSERT INTO test(column3) VALUES('nohello');
  11. ELSIF test(column1) >= -7000 ANDtable(column2) >= 15 THEN INSERT INTO test(column3) VALUES('test');
  12. ELSE INSERT INTO test(column6) VALUES("nodata");
  13. END IF;
  14. END;
  15. $$
  16. LANGUAGE plpgsql;

结果应该是一个如下所示的表:

  1. Column1 | Column2 | Column3
  2. ---------------------------
  3. -8020 | 15 | small
  4. -200 | 1 | nohello
  5. 23 | 115 | test

打电话的时候 new_function 我得到了错误 column1 doesn't exist.

6bc51xsx

6bc51xsx1#

你好像真的在找一个 update (更改现有行上的值)而不是 insert (创建新行)。
但归根结底,我建议只使用计算列:

  1. create table test(
  2. column1 int,
  3. column2 int,
  4. column3 text generated always as (
  5. case
  6. when column1 <= -7000 then 'small'
  7. when column1 <= 15 then 'nohello'
  8. else 'nodata'
  9. end
  10. ) stored
  11. );

在表中插入或更新行时,数据库会相应地自动调整计算列,因此它总是最新的。
db小提琴演示:

  1. insert into test(column1, column2) values(-8020,15),(-200,1),(23,115);
  2. select * from test;
  1. column1 | column2 | column3
  2. ------: | ------: | :------
  3. -8020 | 15 | small
  4. -200 | 1 | nohello
  5. 23 | 115 | nodata

请注意,生成的列仅在postgres 12开始时可用。在早期版本中,一种替代方法是仅使用表中的前两列,并创建视图以公开第三列:

  1. create view myview as
  2. select
  3. column1,
  4. column2,
  5. case
  6. when column1 <= -7000 then 'small'
  7. when column1 <= 15 then 'nohello'
  8. else 'nodata'
  9. end as column3
  10. from mytable

然后可以查询视图而不是表来显示数据。

展开查看全部
mnemlml8

mnemlml82#

gmb的答案是完美的解决方案,尽管您可以使用 CASE 条件表达式,如下所示

  1. update test
  2. set column3 = case
  3. when column1 <= - 7000 then 'small'
  4. when (column1 >= - 7000 and column2 <= 15) then 'nohello'
  5. when (column1 >= - 7000 and column2 >= 15) then 'test'
  6. else 'nodata'
  7. end;
  8. ``` `Demo`

相关问题