首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自同一行的2个值的总和

来自同一行的2个值的总和
EN

Stack Overflow用户
提问于 2018-10-08 19:15:51
回答 1查看 64关注 0票数 0

我是PostgreSQL9.3的新手,我发现自己在一个简单的操作中遇到了麻烦。我必须使用触发器执行两列数值的总和,并将结果写入第三列。这是我的起始表:

代码语言:javascript
复制
CREATE TABLE pratica
(
  progressivo text NOT NULL DEFAULT nextval('pratica_prog_seq'::regclass),
  sal1_importo_arc numeric(10,2),
  sal1_spese numeric(10,2),
  sal1_totale numeric(10,2),
   note text,
  CONSTRAINT pratica_pkey PRIMARY KEY (progressivo)
)
WITH (
  OIDS=FALSE
);

这是函数和触发器:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION sum_sal1()
RETURNS trigger AS
$$
BEGIN
IF NEW.sal1_importo_arc IS NULL
THEN
UPDATE pratica
SET sal1_totale = NEW.sal1_spese
WHERE pratica.sal1_totale IS DISTINCT FROM pratica.sal1_spese;
ELSE IF NEW.sal1_spese  IS NULL
THEN
UPDATE pratica
SET sal1_totale = NEW.sal1_importo_arc
WHERE pratica.sal1_totale IS DISTINCT FROM pratica.sal1_importo_arc;
ELSE
UPDATE pratica
SET sal1_totale = (SELECT (NEW.sal1_importo_arc + NEW.sal1_spese))
WHERE pratica.sal1_totale IS DISTINCT FROM (SELECT (pratica.sal1_importo_arc + pratica.sal1_spese));
END IF;
END IF;
RETURN NULL;
END
$$
  LANGUAGE plpgsql VOLATILE

CREATE TRIGGER sum_sal1
  AFTER INSERT OR UPDATE OF sal1_importo_arc
  ON pratica
  FOR EACH ROW
  EXECUTE PROCEDURE sum_sal1();

sal1_spesesal1_importo_arc可能包含NULL值,因此我设置了适当的条件。问题是,当触发器被触发时,它会用修改后的行的相同值更新整个表的列sal1_total,而不仅仅是change对象的行。我说错了什么?谢谢

EN

Stack Overflow用户

发布于 2018-10-08 19:34:45

在可能包含NULL的表达式中使用COALESCE()

没有理由在每次应该计算值时都更新表,因为您可以通过如下简单的方式使用触发器BEFORE

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION sum_sal1()
RETURNS trigger AS
$$
BEGIN
    NEW.sal1_totale = COALESCE(NEW.sal1_importo_arc, 0) + COALESCE(NEW.sal1_spese, 0);
    RETURN NEW;
END
$$
  LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER sum_sal1
  BEFORE INSERT OR UPDATE
  ON pratica
  FOR EACH ROW
  EXECUTE PROCEDURE sum_sal1(); 
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52701083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档