如何创buildPostgreSQL触发器来插入另一列的值?

这是我的情况:我有一个PostgreSQL表用于存储电子邮件地址,有时电子邮件地址包含地址扩展名,如[email protected] ,我想创build一个触发器来存储地址没有扩展到另一列。

  • SQL列:电子邮件,email_raw(没有地址扩展名)。
  • 我尝试过这个function和触发器,但它不工作:
创build或replacefunctionstrip_addr_extension()RETURNS TRIGGER AS $$
开始
     IF(NEW.email LIKE'%+%')THEN
         NEW.email_raw:= split_part(NEW.email,'+',1)||  '@'||  split_part(NEW.email,'@',-1);
    其他
         NEW.email_raw:= NEW.email;
    万一;
    返回新;
结束;
 $$ LANGUAGE plpgsql;

 CREATE TRIGGER maddr_email_raw
    之前插入maddr
    为每一行
    执行过程strip_addr_extension();

当我插入一个新的logging,它会引发错误:

 SQL> insert into maddr(email)values('[email protected]');

错误:函数split_part(bytea,unknown,integer)不存在
 LINE 1:SELECT split_part(NEW.email,'+',1)||  '@'||  split_part(NE ...
                ^
提示:没有函数匹配给定的名称和参数types。 您可能需要添加明确的types转换。
 QUERY:SELECT split_part(NEW.email,'+',1)||  '@'||  split_part(NEW.email,'@',-1)
 CONTEXT:PL / pgSQL函数strip_addr_extension()第4行赋值

有什么问题,我该如何解决? 谢谢。 🙂

错误:函数split_part(bytea,unknown,integer)不存在

此错误消息显示email列的types为bytea ,通常用于二进制数据。

文本函数不能使用二进制参数,因为它们不能假定在一系列字节后面有一个有效的编码(和哪一个)的文本。

考虑将数据types更改为text或使用convert_from(string bytea, src_encoding name)函数将bytea数据dynamic转换为text数据。