Regex 如何使用pgsql传输具有多个条件的数据?

Regex 如何使用pgsql传输具有多个条件的数据?,regex,postgresql,if-statement,sql-insert,Regex,Postgresql,If Statement,Sql Insert,我想创建一个触发器,我可以检查上传的数据,也可以插入到另一个表中。在初始表(捕获)中,我有15列,但我只想将5列(环号、代码、年份、日期、种类、位置)转移到另一个表(环) 环表是一个背景表,我在其中收集环编号和代码的组合,更具体地说,一个环编号只能与一个代码配对。有一个例外,当代码包含“X”时,可以稍后更改,在这种情况下,此代码可以与更多的环号配对,如果最初属于环号,则可以稍后更改带有“X”的代码 在捕获表中,可以在第三列的条件下多次上载相同的代码和环号组合。但环号仍然只能与一个代码配对,包括“

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

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

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

另外:ring\u number是非空列,但code可以为空。不同的环号可以与空的代码配对,而不是与实际值配对

我的代码有几个问题:

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

2:我用重新捕获列写条件检查点,如果我有一个旧的组合,这是正确的方法,并说请将重新捕获列设置为是。但是如果我将“重新捕获”列设置为“是”,则会收到相同的错误消息

你能帮我解决这些问题吗

这是我的密码:

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

声明
整数:=0;
b整数:=0;
c整数:=0;
d整数:=0;
开始
如果是新的.code“”,则
--Az‘a’表示给定的环_编号是否已存在于数据库中,且代码不是空的
从plover\u捕获PC中选择一个计数(*),其中PC.ring\u number=new.ring\u number和PC.code new.code和PC.code''以及PC.code~'[X]{2}[\.]{1}[X]{2}[X]{1}[X]{2}.{1}[X]{2}';
--Az“b”表示给定代码已存在于数据库中,并带有环号
从plover\u捕获PC中选择b计数(*),其中PC.ring\u编号new.ring\u编号和PC.code=new.code和PC.code~'[X]{2}[\.]{1}[X]{1}[X]{2}[\.]{1}[X]{2}';
--Az'c'数据库中给定的环_编号和给定的代码存在多少次
从plover\u捕获PC中选择进入c计数(*),其中PC.ring\u number=new.ring\u number和PC.code=new.code和PC.code~'[X]{2}[\.]{1}[X]{2}[X]{2}[\.]{1}[X]{2}';
--Az‘d’表示给定的组合是否已存在于环表中
从plover_rings PC中选择进入d计数(*),其中PC.ring_编号=new.ring_编号,PC.code=new.code;
如果a>0,则
引发异常“此环号之前已与另一个代码配对。%”,新的环号;
如果结束;
如果b>0,则
引发异常“此代码已与之前的另一个环号配对。%”,新代码;
如果结束;
如果c>0且(new.rettrap为null或new.rettrap为false),则
引发异常“此环号和代码对已在数据库中。因此它是一个rettrap,但rettrap属性设置为false或null。%,%,%',new.ring_编号、new.code、new.rettrap;
如果结束;
如果c=0且new.rettrap为真,则
引发异常“rettrap属性设置为true,但此环号和代码对尚不在此数据库中。%,%,%,new.ring_编号、new.code、new.rettrap;
如果结束;
如果c=0,d=0,则
插入到plover_环值中(新的.ring_编号、新的.code、新的.species、新的.location、新的.year、新的.date);
如果结束;
如果结束;
归还新的;
终点

为什么你需要正则表达式而不是像%X%那样的
呢?更简短、可读性更强:
a:=count(*)from…
@Jeremy thx这个建议非常有用!我是SQL新手,我的第一个想法是正则表达式。@Abelisto谢谢你的建议。如果您的意思是,在开始之前只delate declare part并使用建议的格式,那么很遗憾,它不起作用。不删除声明,这是工作,确实更可读!再次感谢您的建议。