如何在 Postgresql 中创建用户定义的函数?
How to create a user-defined function in Postgresql?
我在 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);
当您return生成结果时,函数应定义为returns table()
。如果您只想 return 结果,则不需要 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;
您 调整了 returned 列的数据类型 - 我只是根据名称猜到了它们。
请注意,由于 table x
上的条件,您的完整外部联接实际上是 left join
因为它是一个集合 returning 函数,所以在 FROM
子句中像 table 一样使用它:
select *
from get_data(time '23:50', 2020, 1);
我在 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);
当您return生成结果时,函数应定义为returns table()
。如果您只想 return 结果,则不需要 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;
您 调整了 returned 列的数据类型 - 我只是根据名称猜到了它们。
请注意,由于 table x
left join
因为它是一个集合 returning 函数,所以在 FROM
子句中像 table 一样使用它:
select *
from get_data(time '23:50', 2020, 1);