使用 "case when" 和 "else" 的 PostgreSQL 触发器函数

PostgreSQL trigger function using "case when" and "else"

我做了一个更新触发器的代码。每当我更新时,如果“价格”为空,我想用 1000 填充 table“new_book”的“价格”列,如果“价格”不为空,则为 5% 的折扣。我的 postsql 代码是

create function test()
returns trigger
as
$$
declare pr1 numeric ;
begin
case when old.price is null then pr1=1000 
else pr1=pr1*0.95 end
end;
return new;
end
$$
language plpgsql; 

但是如果我 运行 这段代码,PGAdmin 会显示这样的错误

ERROR:  syntax error at or near "else"
LINE 8: else pr1=pr1*0.95 end
        ^
SQL state: 42601
Character: 117

我该如何解决这个问题?

你想要一个 IF 语句。如果要更改 table 中存储的值,则需要修改 new 记录:

create function test()
  returns trigger
as
$$
begin
  if new.price is null then 
    new.new_book := 1000;
  else 
    new.new_book := new.price * 0.95
  end if;
  return new;
end
$$
language plpgsql; 

为了使分配真正持久化,您必须使用 BEFORE 触发器:

create trigger set_new_book_trigger
  <b>before</b> insert or update on the_table
  for each row 
  execute procedure test();