postgresql - 带条件的触发函数

postgresql - trigger function with condition

我正在尝试创建一个带条件的触发器。根据几何长度,我希望属性 "nom" (= name) 以大写或小写形式书写。

这是我拥有的:

CREATE OR REPLACE FUNCTION public.test_upper_lower()  
RETURNS trigger AS  
    $BODY$
        BEGIN  
            NEW.dummy:= (ST_Length(new.geom)); 
            if (SELECT dummy FROM ligne_ligne)>100 
            then NEW.nom:= LOWER(nom) FROM ligne_ligne; 
            else NEW.nom:= UPPER(nom) FROM ligne_ligne;  
            end if;
            RETURN NEW;
        END;
    $BODY$
LANGUAGE plpgsql;  
DROP trigger IF EXISTS test_upper_lower on public.ligne_ligne;  
CREATE trigger test_upper_lower BEFORE INSERT OR UPDATE on public.ligne_ligne  
    FOR EACH ROW 
    EXECUTE PROCEDURE public.test_upper_lower();

有了这个我有一个 "more than one row returned by a subquery" 错误

根据这个论坛上的其他问题,我尝试使用 case 而不是 if 并在触发器本身中使用 when 而不是函数,但两者都不起作用

有什么想法吗? 谢谢

您不需要(或者实际上可以)使用 SELECT 语句来访问插入行中的数据。

部分 SELECT dummy FROM ligne_ligne returns all 行来自 table - 不仅仅是来自与触发器相关的行。

由于您只是想检查刚刚计算的值,因此只需在该点使用 new.dummy

CREATE OR REPLACE FUNCTION public.test_upper_lower()  
RETURNS trigger AS  
$BODY$
BEGIN  
  NEW.dummy:= ST_Length(new.geom); 
  if new.dummy > 100 then --<< no SELECT necessary
    NEW.nom:= LOWER(new.nom); --<< no "FROM", just access the value 
  else 
    NEW.nom:= UPPER(new.nom);  
  end if;
  RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;