如何从 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
我目前正在使用此 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