我有许多用 PL/pgSQL 编写的触发函数,它们遵循以下逻辑:
SELECT my_name
INTO l_my_name
FROM data
WHERE data.my_number = NEW.test_num;
IF NOT FOUND THEN
INSERT INTO test_event
VALUES (NEW.test_num, NULL, NEW.event_one, NEW.event_two);
ELSE
INSERT INTO test_event
VALUES (NEW.test_num, l_my_name, NEW.event_one, NEW.event_two);
END IF;
一些插入具有超过 15 个以上的值,我试图将它们简化为仅 1 个插入,因为上面的代码一遍又一遍地重复存储过程中的不同检查,不必要地使过程有数百行代码长。我的想法是这样的:
INSERT INTO test_event
VALUES (NEW.test_num, NULLIF(l_my_name,''), NEW.event_one, NEW.event_two);
我不确定如果没有找到它是否l_my_name
会正常工作,或者我是否必须做一些不同的事情。''
NULLIF
简化为:
① 拼写出目标列。在持久化代码中,这是非常可取的,否则它会在模式更改为 table 后静默中断
text_event
。② 如果
data
找到表中的行,data.my_name
则插入。 子查询中的“无行”被转换为NULL
- 正是您需要的。这里不''
涉及空字符串 () - 除非data.my_name
碰巧是''
。(当然,子查询不能返回多于一行,否则会引发异常。)
这简化了您显示的逻辑。我将不得不查看您的完整表定义、触发器和触发器函数,以判断该操作是否有意义。