postgresql - 如何循环遍历 pg/PLSQL 中的列列表?
问题描述
我有一个表,其中包含大约 3 打 VARCHAR 列,在将记录插入数据库之前都需要进行相同的清理(将空字符串转换为 NULL)。有多个应用程序访问数据库,所以我想在触发器中执行此操作。我可以编写代码来检查和设置每一列,但我想循环遍历这些列。我编写的函数不会产生错误,但它也不会将空列设置为 NULL。
CREATE OR REPLACE FUNCTION public.validate_flds() RETURNS trigger AS
$BODY$
DECLARE
coldata VARCHAR;
collist VARCHAR[];
BEGIN
collist := ARRAY[NEW.fld01,NEW.fld02,NEW.fld03];
FOREACH coldata IN ARRAY collist LOOP
IF coldata = '' THEN coldata := NULL; END IF;
END LOOP;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
我错过了什么?
解决方案
在
IF coldata = '' THEN coldata := NULL; END IF;
NEW
在记录保持不变的情况下更改变量的值。没有简单的方法可以在循环中执行您想要的操作。我建议使用NULLIF().
begin
new.fld01:= nullif(new.fld01, '');
new.fld02:= nullif(new.fld02, '');
new.fld03:= nullif(new.fld03, '');
return new;
end;
推荐阅读
- django - django shell_plus:自动重载不起作用
- c# - Unity 设置 GUI 元素相对于不同画布上的另一个元素的位置
- c++ - c ++函数声明,头文件中的构造函数
- mongodb - 在嵌套数组中推送消息(Mongodb)
- html - 如何用html制作操作系统?
- angular - Angular中的对象属性值清理问题
- python - 如何在 Python 中使用 OpenCV 制作运动计数器?
- digital-ocean - 如何在数字海洋应用平台更新github源码?
- formal-verification - 无法证明仅依赖于实现/内联的基本功能
- acumatica - 可以将记录计数添加到分页网格吗?