我想通过触发器从";nat_ cond";"的属性;depart_bt";表,同一表的3个其他属性的值";sect_ph"sect_n"metal_ cd";split_part(..,'_',..(函数的每个应用程序。
例如:如果";nat_cond":3*240+120mm2_AR2V_ALU
我应该得到:
"sect_ph":3*240+120mm2
"sect_n":AR2V
"metal_cd":ALU
我的代码如下:
CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER
language plpgsql AS
$$
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
NEW.sect_ph:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 1) LIMIT 1);
NEW.sect_n:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 2) FROM depart_bt LIMIT 1);
NEW.metal_cond:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 3) FROM depart_bt LIMIT 1);
END IF;
RETURN NEW;
END;
$$
;
-- table depart_bt
DROP TRIGGER IF EXISTS nat_conducteur ON depart_bt;
CREATE TRIGGER nat_conducteur BEFORE INSERT OR UPDATE ON depart_bt
FOR EACH ROW EXECUTE PROCEDURE nat_cond_auto();
然而,除了添加的第一行什么也不做之外,触发器工作得很好。
我想我打了个圈。提前感谢您的帮助。
赋值中的SELECT语句是完全无用的,因为您没有使用将返回的潜在行中的任何数据。但这些选择也是触发器不起作用的原因:如果表为空,select ... from depart_bt limit 1
将不会返回任何内容。
我想你只是想要:
CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER
language plpgsql AS
$$
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
NEW.sect_ph := split_part(NEW.nat_cond::TEXT, '_', 1);
NEW.sect_n := split_part(NEW.nat_cond::TEXT, '_', 2);
NEW.metal_cond := split_part(NEW.nat_cond::TEXT, '_', 3);
END IF;
RETURN NEW;
END;
$$
;
请注意,IF TG_OP = ...
并不是真正必要的,因为您的触发器定义使触发器仅在更新或插入语句时触发。