如何使用数组插入函数中的表?
CREATE TABLE places
(
id SERIAL PRIMARY KEY
,location VARCHAR(100) NOT NULL
,timestamp TIMESTAMP
,person_id INTEGER NOT NULL REFERENCES people ON UPDATE...
);
CREATE TABLE people
(
id SERIAL PRIMARY KEY
,name VARCHAR(100) NOT NULL
);
我正在尝试做一个我会做的功能:
SELECT function(location_name, now(), '{1,2,3}');
这会将3个记录插入到数组中每个person_id的places表中,并具有相同的位置和时间戳。主要问题是数组的长度可以是动态的,因此函数应该能够处理:
SELECT function(location_name, now(), '{3,5,7,8,10}');
我不知道从哪里开始使INSERT动态化并从数组中提取id。 Unest可用于在DECLARE中插入INTO变量,但动态方面无法完成。我希望我明白这一点。
答案 0 :(得分:2)
写一个plpgsql函数总是有可能的(我做了很多)。但这种情况可以更简单地解决:
INSERT INTO places (location, ts, person_id)
SELECT 'some_location', now(), unnest('{1,2,3}'::int4[])
我将您的列名timestamp
替换为ts
,因为我不认为使用类型名称作为标识符是个好主意。它会导致令人困惑的副作用和错误信息。
如果,您需要JOIN
到unnest()
函数的结果集 - 就像您的问题似乎暗示(但问题变得更简单) - 你必须使它成为子查询:
INSERT INTO places (location, ts, name)
SELECT 'some_location', now(), p.name
FROM (SELECT unnest('{1,2,3}'::int4[]) AS id) AS x
JOIN people p USING (id);
我在模型中添加了name
列 not ,只是做了演示。