如何在 Postgresql 中创建条件插入函数?
How to create a conditional insert function in Postgresql?
我尝试编写一个函数,根据 table 中的值在 column3
中插入一些值,但我不太熟悉在 table 中编写函数PostgreSQL 9.6.
--Create some table
CREATE TABLE test(column1 INT, column2 INT, column3 TEXT)
INSERT INTO test VALUES(-8020,15),(-200,1),(23,115)
--Build function
CREATE OR REPLACE FUNCTION new_function()
RETURNS TEXT AS
$$
BEGIN
IF test(column1) <= -7000 THEN INSERT INTO test(column3) VALUES('small');
ELSIF test(column1) >= -7000 AND test(column2) <= 15 THEN INSERT INTO test(column3) VALUES('nohello');
ELSIF test(column1) >= -7000 ANDtable(column2) >= 15 THEN INSERT INTO test(column3) VALUES('test');
ELSE INSERT INTO test(column6) VALUES("nodata");
END IF;
END;
$$
LANGUAGE plpgsql;
结果应该是 table,如下所示:
Column1 | Column2 | Column3
---------------------------
-8020 | 15 | small
-200 | 1 | nohello
23 | 115 | test
调用 new_function
时出现错误 column1 doesn't exist.
您似乎实际上是在寻找 update
(更改现有行的值)而不是 insert
(创建新行)。
但最重要的是,我建议只使用计算列:
create table test(
column1 int,
column2 int,
column3 text generated always as (
case
when column1 <= -7000 then 'small'
when column1 <= 15 then 'nohello'
else 'nodata'
end
) stored
);
当在 table 中插入或更新行时,数据库会相应地自动调整计算列,因此它始终是最新的。
insert into test(column1, column2) values(-8020,15),(-200,1),(23,115);
select * from test;
column1 | column2 | column3
------: | ------: | :------
-8020 | 15 | small
-200 | 1 | nohello
23 | 115 | nodata
请注意,生成的列仅从 Postgres 12 开始可用。在早期版本中,一种替代方法是仅在 table 中包含前两列,然后创建一个视图来公开第三列:
create view myview as
select
column1,
column2,
case
when column1 <= -7000 then 'small'
when column1 <= 15 then 'nohello'
else 'nodata'
end as column3
from mytable
然后您可以查询视图而不是 table 来显示您的数据。
GMB 的答案是完美的解决方案,尽管您可以使用 CASE
条件表达式更新 table,如下所示
update test
set column3 = case
when column1 <= - 7000 then 'small'
when (column1 >= - 7000 and column2 <= 15) then 'nohello'
when (column1 >= - 7000 and column2 >= 15) then 'test'
else 'nodata'
end;
我尝试编写一个函数,根据 table 中的值在 column3
中插入一些值,但我不太熟悉在 table 中编写函数PostgreSQL 9.6.
--Create some table
CREATE TABLE test(column1 INT, column2 INT, column3 TEXT)
INSERT INTO test VALUES(-8020,15),(-200,1),(23,115)
--Build function
CREATE OR REPLACE FUNCTION new_function()
RETURNS TEXT AS
$$
BEGIN
IF test(column1) <= -7000 THEN INSERT INTO test(column3) VALUES('small');
ELSIF test(column1) >= -7000 AND test(column2) <= 15 THEN INSERT INTO test(column3) VALUES('nohello');
ELSIF test(column1) >= -7000 ANDtable(column2) >= 15 THEN INSERT INTO test(column3) VALUES('test');
ELSE INSERT INTO test(column6) VALUES("nodata");
END IF;
END;
$$
LANGUAGE plpgsql;
结果应该是 table,如下所示:
Column1 | Column2 | Column3
---------------------------
-8020 | 15 | small
-200 | 1 | nohello
23 | 115 | test
调用 new_function
时出现错误 column1 doesn't exist.
您似乎实际上是在寻找 update
(更改现有行的值)而不是 insert
(创建新行)。
但最重要的是,我建议只使用计算列:
create table test(
column1 int,
column2 int,
column3 text generated always as (
case
when column1 <= -7000 then 'small'
when column1 <= 15 then 'nohello'
else 'nodata'
end
) stored
);
当在 table 中插入或更新行时,数据库会相应地自动调整计算列,因此它始终是最新的。
insert into test(column1, column2) values(-8020,15),(-200,1),(23,115);
select * from test;
column1 | column2 | column3 ------: | ------: | :------ -8020 | 15 | small -200 | 1 | nohello 23 | 115 | nodata
请注意,生成的列仅从 Postgres 12 开始可用。在早期版本中,一种替代方法是仅在 table 中包含前两列,然后创建一个视图来公开第三列:
create view myview as
select
column1,
column2,
case
when column1 <= -7000 then 'small'
when column1 <= 15 then 'nohello'
else 'nodata'
end as column3
from mytable
然后您可以查询视图而不是 table 来显示您的数据。
GMB 的答案是完美的解决方案,尽管您可以使用 CASE
条件表达式更新 table,如下所示
update test
set column3 = case
when column1 <= - 7000 then 'small'
when (column1 >= - 7000 and column2 <= 15) then 'nohello'
when (column1 >= - 7000 and column2 >= 15) then 'test'
else 'nodata'
end;