regex - 如何使用 pgsql 传输具有多个条件的数据?
问题描述
我想创建一个触发器,我可以检查上传的数据,也可以插入另一个表。在初始表(捕获)中,我有 15 列,但我只想将 5 列(环号、代码、年份、日期、物种、位置)转移到另一个表(环)。
ring表是一个背景表,我在其中收集ring_number和code的组合,更具体地说,一个ring_number只能与一个code配对。有一个例外,当代码包含“X”时,它可以稍后更改,这种情况下该代码可以与更多ring_number配对,如果最初属于ring_number一个带有“X”的代码可以更改之后。
在捕获表中,可以多次上传相同的code和ring_number组合,条件为第三列。但是ring_number仍然只能与一个代码配对,但包含“X”的代码除外。条件列的名称是recapture。如果recapture(布尔列类型)为“true”,则可以再次上传code和ring_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
解决方案
推荐阅读
- html - 在一页上实现侧导航栏打开 - 在第二页上不起作用
- reactjs - Material UI 响应基于元素大小
- kotlin - Kotlin 中的通用函数
- javascript - 如果子 LI 包含特定类,则将类应用于父 UL
- apache - 让 BOSH 通过跨域资源共享在 converse 上运行
- unity3d - 检测到 Surface 时 Vuforia 是否有事件标志?
- spring-boot - SpringBoot,如何使用 application.properties 禁用缓存
- c# - 为什么微软word文件打不开?
- bash - 无法在 bash 脚本中使用外部变量 cd
- json - 如何在 Swift 4.2 中本地访问不同的 JSON 密钥?