postgresql - postgresql - 有条件的触发函数
问题描述
我正在尝试创建带有条件的触发器。根据几何长度,我希望属性“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();
有了这个,我有一个“子查询返回的不止一行”错误
基于此论坛上的其他问题,我尝试使用 case 而不是 if 并在触发器本身中使用 when 不是函数,但两者都不起作用
有任何想法吗 ?谢谢
解决方案
您不需要(或实际上可以)使用SELECT
语句来访问插入行中的数据。
该部分SELECT dummy FROM ligne_ligne
返回该表中的所有行,而不仅仅是与触发器相关的行。
由于您只想检查刚刚计算的值,因此只需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;
推荐阅读
- python - Sklearn 中 Isomap 的示例扩展
- go - 如何在 Go 中解析 RFC3339?
- javascript - jsVectorMap 渲染太小并破坏布局
- oracle - Oracle字符串操作根据分隔符排除特定字符
- c# - 如何获取应用于 ToObject() 的 JSValue 中的属性?
- wireshark - 在一个wireshark中显示多个tcpdump outout
- flutter - Dynamic List View with Text and Radio Button In Flutter
- machine-learning - 给定上下文和可能的单词,如何计算哪个单词最适合?
- elasticsearch - Search Guard 使用 SSL 连接到远程 Elasticsearch 集群
- angular - *ngFor 中是否可以进行反射