如何从 SQL 语法制作 PG 函数和触发器?

How to make a PG function and trigger from SQL syntax?

我目前正在使用此 SQL 语法在检查另一个 table 中的值后更新一个 table 的所有记录:

UPDATE schema.table1 AS c 
SET field1 = 'SI'
FROM schema.table2 AS s
WHERE
c.specie = s.diam20 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.20
OR
c.specie = s.diam40 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.40
OR
c.specie = s.diam60 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.60
OR
c.specie = s.diam80 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.80;

抱歉,我是新手,所以我试图在每次插入或更新 table 1 后设置一个触发器,它会更新 field1 值,调用一个能够执行上述操作的 PG 函数。 请你帮助我好吗? 提前致谢

为什么不简单地创建一个视图来显示此派生信息,而不是存储您随后需要管理的数据?

好处是您可以始终了解最新的数据,无需任何维护成本。

这应该很简单:

create view view1 as
select 
    t1.*, 
    case when exists (
        select 1
        from table2 t2
        where t1.specie = case
            when t1.circonf / pi() >= 0.80 then t2.diam20 
            when t1.circonf / pi() >= 0.60 then t2.diam40 
            when t1.circonf / pi() >= 0.40 then t2.diam60 
            when t1.circonf / pi() >= 0.20 then t2.diam80
        end
    ) then 'SI' end as field1
from table1 t1

旁注:您应该尝试修复您的架构 - 连接逻辑表明它没有正确规范化。您应该将 table2 的四个 diam* 列中的每一列存储在行而不是列中,并在其他列中指定范围,例如:

min_cicronf    max_circonf    diam
0.20 * pi()    0.40 * pi()    ...
0.40 * pi()    0.60 * pi()    ...
0.60 * pi()    0.80 * pi()    ...
0.80 * pi()    null           ...

那么查询可以简化为更简单高效:

create view view1 as
select 
    t1.*, 
    case when exists (
        select 1
        from table2 t2
        where 
            t1.specie = t2.diam
            and t1.circonf >= t2.min_cicronf
            and (t1.circonf < t2.max_cicronf or t2.max_circonf is null)
    ) then 'SI' end as field1
from table1 t1