我正在从 SQL Server 迁移到 Postgresql。在 SQL Server 中,我可以将基于表的函数定义为查询的别名。例子:
Create Function Example(@limit int) As
Returns Table As Return
Select t1.*, t2.*, price * 0.5 discounted
From t1
Inner Join t2 on t1.id = t2.id
Where t1.price < @limit;
GO
Select * From Example(100);
Run Code Online (Sandbox Code Playgroud)
它为我提供了一种返回所有字段的方法,并且我不需要为它们指定类型。我可以轻松更改表的字段类型、添加新字段、删除字段,然后重新创建函数。
那么问题是如何在 Postgresql 中做这样的事情呢?我发现Postgresql在编写函数时需要显式指定所有字段名称和类型。也许我需要别的东西,而不是函数?
Postgres 隐式地为每个表创建一个类型。因此,如果您只是从一个表中进行选择,那么最简单的方法是在函数定义中使用该类型:
CREATE TABLE test (id int, value int);
CREATE FUNCTION mytest(p_id int)
RETURNS test AS
$$
SELECT * FROM test WHERE id = p_id;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在测试中自由添加、删除或更改列,并且您的函数仍将返回正确的列。
编辑:问题已更新为在限制子句中使用函数参数并使用更复杂的查询。我仍然会推荐类似的方法,但您可以使用 @Bergi 推荐的视图:
CREATE TABLE test1 (a int, b int);
CREATE TABLE test2 (a int, c int);
CREATE VIEW test_view as SELECT a, b, c from test1 JOIN test2 USING (a);
CREATE FUNCTION mytest(p_limit int)
RETURNS SETOF test_view AS
$$
SELECT * FROM test_view FETCH FIRST p_limit ROWS ONLY
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
您不会找到 SQL Server 中行为的精确替代品,这不是 Postgres 的工作方式。
IVO*_*LOV -1
你可以做这样的事情
CREATE OR REPLACE FUNCTION Example(_id int)
RETURNS RECORD AS
$$
DECLARE
data_record RECORD;
BEGIN
SELECT * INTO data_record FROM SomeTable WHERE id = _id;
RETURN data_record;
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4506 次 |
| 最近记录: |