我有多个表,其中每两行都是感兴趣的:connection_node_start_id
和connection_node_end_id
。我的目标是获得所有这些ID的集合,或者作为平面ARRAY
,或者作为由一行组成的新TABLE
。
示例输出ARRAY:
result = {1,4,7,9,2,5}
示例输出表:
IDS
-------
1
4
7
9
2
5
我的第一次尝试有点笨拙,不能正常工作,因为SELECT
语句只返回一行。看来一定有一个简单的方法可以做到这一点,有人能指出我到正确的方向吗?
CREATE OR REPLACE FUNCTION get_connection_nodes(anyarray)
RETURNS anyarray AS
$$
DECLARE
table_name varchar;
result integer[];
sel integer[];
BEGIN
FOREACH table_name IN ARRAY $1
LOOP
RAISE NOTICE 'table_name(%)',table_name;
EXECUTE 'SELECT ARRAY[connection_node_end_id,
connection_node_start_id] FROM ' || table_name INTO sel;
RAISE NOTICE 'sel(%)',sel;
result := array_cat(result, sel);
END LOOP;
RETURN result;
END
$$
LANGUAGE 'plpgsql';
试验台:
connection_node_start_id | connection_node_end_id
--------------------------------------------------
1 | 4
7 | 9
电话:
SELECT get_connection_nodes(ARRAY['test_table']);
结果:
{1,4} -- only 1st row, rest is missing
3条答案
按热度按时间xvw2m8pv1#
dba.SE上的相关答案:
或者放弃循环并连接单个查询。最快:
相关内容:
LATERAL
由Postgres 9.3引入。非常旧的Postgres版本
您也可以在
SELECT
列表中使用集合返回函数unnest()
:应该与pg 8.4+(或甚至更老)工作。同样适用于当前的Postgres(9.4),但
LATERAL
更干净。或者让它变得非常简单:
**
format()
**在第9.1页中引入。对于大表可能会慢一点,因为每个表对每个列扫描一次(这里是2次)。结果中的排序顺序也不同-但这对您来说似乎并不重要。
请务必清理转义标识符,以防止SQL注入和其他非法语法。详细内容:
wooyq4lh2#
EXECUTE ... INTO
语句只能返回单行中的数据:如果返回多行,则只有第一行将被分配给INTO变量。
为了连接所有行的值,你必须先按列聚合它们,然后追加数组:
jckbn6z73#
你可能正在寻找这样的东西: