我有两个独立的数据库(MySQL和PostgreSQL),它们维护组织中不同部门的不同数据集——这是不可更改的。我需要连接到其中一个数据库,用python中的DBAPI从第一个数据库获取symbolsids的列表,并请求另一个集并对其进行操作。
(我在这种方法上花了很多时间,这是有意义的,因为我的体系结构中有其他组件,所以除非有更好的替代方法,否则我希望坚持使用这种方法。)

CREATE TABLE foo (fooid int, foosubid int, fooname text);
INSERT INTO foo VALUES (1, 1, 'Joe');
INSERT INTO foo VALUES (1, 2, 'Ed');
INSERT INTO foo VALUES (2, 1, 'Mary');

CREATE FUNCTION get_results(text[]) RETURNS SETOF record AS $$
SELECT fooname, fooid, foosubid FROM foo WHERE name IN $1;
$$ LANGUAGE SQL;

实际上,我的SQL要复杂得多,但是我认为这个方法完全描述了目的。我可以将任意长度的参数传入存储过程或用户定义的函数并返回结果集吗?
我想调用如下函数:
SELECT * FROM get_results(('Joe', 'Ed'));
SELECT * FROM get_results(('Joe', 'Mary'));
SELECT * FROM get_results(('Ed'));

我相信使用IN并传递这些参数(如果可能的话)将给我与JOIN相同(或类似)的性能。对于我当前的用例,符号不会超过750-1000个“名称”,但是如果性能是一个问题,我也想知道原因。

最佳答案

使用RETURNS TABLE而不是RETURNS SETOF record。这将简化函数调用。
您不能用这种方式使用IN运算符。改为使用ANY

CREATE FUNCTION get_results(text[])
RETURNS TABLE (fooname text, fooid int, foosubid int)
AS $$
    SELECT fooname, fooid, foosubid
    FROM foo
    WHERE fooname = ANY($1);
$$ LANGUAGE SQL;

SELECT * FROM get_results(ARRAY['Joe']);

 fooname | fooid | foosubid
---------+-------+----------
 Joe     |     1 |        1
(1 row)

如果函数返回一组记录,则必须在每个函数调用中放置列定义列表:
SELECT *
FROM get_results(ARRAY['Joe']) AS (fooname text, fooid int, foosubid int)

10-04 23:34
查看更多