首页 > 解决方案 > 用单行 NEW 替换表以进行查询

问题描述

在我的插入X表的触发过程中,我想检查某个查询的结果是什么,如果表X只包含具有当前插入值的单行(NEW)。

我在过程中尝试了以下操作(简化代码):

WITH X AS (SELECT * FROM NEW)
SELECT * FROM X WHERE …some_conditions…

…但是SELECT * FROM NEW无效。

我找不到任何“投射”NEW到桌子上的方法。甚至可能吗?

标签: postgresqldatabase-trigger

解决方案


您可以使用SELECT * FROM (VALUES(NEW.*)) AS my_alias;

例子:

CREATE TABLE test_trig_new (
 id int4 NULL,
 val text NULL,
 val2 text NULL
);

CREATE OR REPLACE FUNCTION trig_test_new()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
DECLARE
  l_row test_trig_new%rowtype;
BEGIN
  SELECT * INTO l_row FROM (VALUES(NEW.*)) AS a;
  RAISE NOTICE 'val2 %, record %', l_row.val2, l_row;
  RETURN NEW;
END
$function$
;

CREATE TRIGGER trig_test_new
BEFORE INSERT ON test_trig_new
FOR EACH ROW EXECUTE PROCEDURE trig_test_new();

INSERT INTO test_trig_new VALUES (55, 'test55', 'test66423');

--raises NOTICE: val2 test66423, record (55,test55,test66423)

推荐阅读