首页 > 解决方案 > PostgreSQL Insert into with case and concat

问题描述

我正在尝试创建一个插入触发器,它将从表 A 中获取两个字符串字段(x 和 y)并将它们连接到表 B 中的单个字段中。如果 y 不为空,我想在 x 之间添加一个“-”和 y 当我连接时。到目前为止,我的代码如下所示:

BEGIN
    INSERT INTO B(xy,z)
        SELECT y,z,
            CASE WHEN y IS NOT NULL then concat('some prefix',x,' - ',y)
                ELSE concat('some prefix',x)
            END
        FROM(SELECT NEW.x, NEW.y NEW.z) as n;
        WHERE [some conditions]
    RETURN NEW;
END;

据我了解,它应该在表 B 的 xy 字段中放置“某个前缀 x - y”或“某个前缀 x”,并在 B 的 z 中从 A 中放置 z,但我收到错误“插入的表达式比目标列”。有人知道我做错了什么吗?

标签: postgresqlinsertcaseconcat

解决方案


您的外部选择列表包含三个术语 -y和表达式,只需删除z并重新排序另外两个,您应该就可以了:casey

INSERT INTO B(xy,z)
SELECT
    CASE WHEN y IS NOT NULL then concat('some prefix',x,' - ',y)
        ELSE concat('some prefix',x)
    END, -- First expression, goes into b.xy
    z -- SEcond expression, goes into b.z
FROM(SELECT NEW.x, NEW.y NEW.z) as n;
WHERE [some conditions]

推荐阅读