首页 > 解决方案 > 如何使用 pgsql 传输具有多个条件的数据?

问题描述

我想创建一个触发器,我可以检查上传的数据,也可以插入另一个表。在初始表(捕获)中,我有 15 列,但我只想将 5 列(环号、代码、年份、日期、物种、位置)转移到另一个表(环)。

ring表是一个背景表,我在其中收集ring_numbercode的组合,更具体地说,一个ring_number只能与一个code配对。有一个例外,当代码包含“X”时,它可以稍后更改,这种情况下该代码可以与更多ring_number配对,如果最初属于ring_number一个带有“X”的代码可以更改之后。

在捕获表中,可以多次上传相同的codering_number组合,条件为第三列。但是ring_number仍然只能与一个代码配对,但包含“X”的代码除外。条件列的名称是recapture。如果recapture(布尔列类型)为“true”,则可以再次上传codering_number的组合。如果它是“空”或“否”,您只能上传代码ring_number的新组合. 如果有人上传旧组合,则必须引发以下错误消息:此组合已存在,请检查您的数据,如果是重新捕获,则将重新捕获列设置为是。

另外:ring_number是一个非空列,但代码可以为空。并且不同的 ring_number可以与空代码配对,而不是稍后可以与实际值配对。

我的代码有几个问题:

1:我想用正则表达式定义X的异常,X可以在代码中的任何地方。但是不能很好地管理正则表达式。它只是行不通。

2:我用recapture列编写条件检查点,如果我有一个旧组合,这是正确的工作方式,并说请将recapture列设置为 yes。但!如果我将recapture列设置为 yes,我会收到相同的错误消息。

你能帮忙解决这些问题吗?

这是我的代码:

Declare

  a   integer := 0;
  b   integer := 0;
  c   integer := 0;
  d   integer := 0;

Begin

  IF new.code <> '' THEN

    --Az 'a' means whether the given ring_number already exist in the database with a code, which is not empty
    SELECT INTO a COUNT(*) FROM plover_captures PC WHERE PC.ring_number = new.ring_number AND PC.code <> new.code AND PC.code <> '' AND PC.code ~ '[X]{2}[\.]{1}[X]{2}[|]{1}[X]{2}[\.]{1}[X]{2}';

    --Az 'b' means the given code already exist in the database with a ring_number
    SELECT INTO b COUNT(*) FROM plover_captures PC WHERE PC.ring_number <> new.ring_number AND PC.code = new.code AND PC.code ~ '[X]{2}[\.]{1}[X]{2}[|]{1}[X]{2}[\.]{1}[X]{2}';

    --Az 'c' how much times exist the given ring_number with the given code in the database
    SELECT INTO c COUNT(*) FROM plover_captures PC WHERE PC.ring_number = new.ring_number AND PC.code = new.code AND PC.code ~ '[X]{2}[\.]{1}[X]{2}[|]{1}[X]{2}[\.]{1}[X]{2}';

    --Az 'd' means the given combination already exist in ring table or not
    SELECT INTO d COUNT(*) FROM plover_rings PC WHERE PC.ring_number = new.ring_number AND PC.code = new.code; 

    IF a > 0 THEN
      raise exception 'This ring_number is already paired with another code before. %', new.ring_number;
    END IF;

    IF b > 0 THEN
      raise exception 'This code is already paired with another ring_number before. %', new.code;
    END IF;

    IF c > 0 AND (new.rettrap IS null OR new.rettrap IS false) THEN
      raise exception 'This ring_number and code pair is already in the database. So it is a rettrap but the rettrap attribute set to false or null. %, %, %', new.ring_number, new.code, new.rettrap;
    END IF;

    IF c = 0 AND new.rettrap IS true THEN
      raise exception 'The rettrap attribute set to true but this ring_number and code pair is not in this database yet. %, %, %', new.ring_number, new.code, new.rettrap;
    END IF;

    IF c = 0 AND d = 0 THEN
      Insert into plover_rings values(new.ring_number,new.code,new.species,new.location,new.year, new.date);
    END IF;

  END IF;

  Return new;

End

标签: regexpostgresqlif-statementsql-insert

解决方案


推荐阅读