将结果列从函数集成到主查询

Posted

技术标签:

【中文标题】将结果列从函数集成到主查询【英文标题】:Integrating resultant columns from function to main query 【发布时间】:2018-05-11 08:36:42 【问题描述】:

我创建了一个函数,它返回一个包含一行三列的表。

DROP FUNCTION IF EXISTS get_event_deposit_values(INTEGER, date, date);
CREATE OR REPLACE FUNCTION get_event_deposit_values(event_id INTEGER, start_date date, end_date date)
RETURNS TABLE (carried_over INTEGER, current_month INTEGER, deposit INTEGER)
AS $$
DECLARE status INTEGER;
BEGIN
    carried_over := 0;
    current_month := 0;
    deposit := 0;

    RETURN QUERY
    SELECT carried_over, current_month, deposit;
END
$$ LANGUAGE plpgsql;

在 pgAdmin 中运行一个简单的查询。 select * FROM get_event_deposit_values(20170913, '1999/01/01', '2018/05/11'); 它返回三列和一行。 然后,结合主查询运行查询(在网站上看到)。 select t.id from t_events AS t, lateral get_event_deposit_values(t.id, '1999/01/01', '2018/05/11') where id = 20170913; get_event_deposit_values(t.id 附近发生错误。我正在运行的 PostgreSQL 版本是 8.3,它已经过时了。有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

documentation on lateral subqueries(在第一个版本中,支持它,如果我没有忽略某些东西,它是 9.3)状态,即使没有关键字,表函数也是横向的。因此,您的版本中可能也存在这种情况。

所以试试会发生什么,如果你只是删除关键字LATERAL

如果这不起作用(我希望如此),您可以在列列表的子查询中选择函数的每个不同列作为解决方法。

SELECT t.id,
       (SELECT carried_over
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) carried_over,
       (SELECT current_month
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) current_month,
       (SELECT deposit
               FROM get_event_deposit_values(t.id, '1999/01/01', '2018/05/11')) deposit
       FROM t_events t
       WHERE t.id = 20170913;

(并且可能考虑更新到更新的版本。)

【讨论】:

似乎这是唯一的方法。因此,我将函数分成三个较小的函数,它们只返回一个值而不是一个表,因为我认为它可能更有效。

以上是关于将结果列从函数集成到主查询的主要内容,如果未能解决你的问题,请参考以下文章

通过 dplyr 聚合 - 将单个列从因子变为数字

使用窗口函数根据另一列从列中检索值

在 PLSQL 循环中提交以进行更新

java——异常

在 Windows 操作系统的情况下,如何将数据从 OpenCV 或 C++ 线程函数返回到主线程?

将 MySQL 查询结果保存到 CSV 文件