【问题标题】:How to create a user-defined function in Postgresql?如何在 Postgresql 中创建用户定义的函数?
【发布时间】:2021-01-23 17:39:42
【问题描述】:

我在 Postgres 中有以下查询。我想要一个函数,用户可以使用函数调用动态定义record_year和record_month的值,而无需在查询语句中指定。这样,对于 record_year 和 record_month 的不同用户输入值(在这种情况下),可以重复使用相同的查询。谁能帮帮我?

SELECT x.sid, x.record_year, x.record_month, y.addr
FROM x
FULL OUTER JOIN y
  ON x.sid = y.sid
WHERE x.record_time='23:50' 
  and x.record_year='2020' 
  and x.record_month='1'
group by x.station_id, x.record_year, x.record_month, y.addr;

函数调用可能类似于select function_name(record_year, record_month);

【问题讨论】:

    标签: postgresql user-defined-functions plpgsql


    【解决方案1】:

    当您返回结果时,函数应定义为returns table()。如果您只想返回结果,则不需要 PL/pgSQL。一个 SQL 函数就足够了。

    create function get_data(p_time time, p_year int, p_month int)
      returns table (sid int, record_year int, record_month int, addr text)
    as
    $$
      SELECT x.sid, x.record_year, x.record_month, y.addr
      FROM x
        FULL OUTER JOIN y ON x.sid = y.sid
      WHERE x.record_time p_time
        and x.record_year = p_year
        and x.record_month = p_month
      group by x.station_id, x.record_year, x.record_month, y.addr
    $$
    language sql
    stable;
    

    必须调整返回列的数据类型 - 我只是根据名称猜测它们。

    请注意,由于表 x 上的条件,您的完全外部联接实际上是 left join

    因为它是一个集合返回函数,所以像FROM clause 中的表格一样使用它:

    select *
    from get_data(time '23:50', 2020, 1);
    

    【讨论】:

    • 嘿,是否可以在函数调用中传递表的名称?在上面的示例中,x 和 y 是涉及的两个表。假设我想用户定义要在其上执行查询的表。是否可以在函数调用中传递表名???如果可能的话,你能告诉我一个如何做的例子吗?!只是好奇。非常感谢。
    猜你喜欢
    • 2011-12-13
    • 2016-08-03
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2015-02-06
    相关资源
    最近更新 更多