我是 Postgres 和 postgREST 的新手。我需要从一列接收不同的记录 - 理想情况下可以过滤。
我需要解决的任务是 SQL
select distinct "column1" where "column2" = "value2 and "column3" = "value3
"
column1、column2、colum3 和 values 应该是 REST 调用的参数。
在 postgREST 中,我可能需要使用函数或存储过程,但我对此并不陌生。
你能帮忙吗?
我是 Postgres 和 postgREST 的新手。我需要从一列接收不同的记录 - 理想情况下可以过滤。
我需要解决的任务是 SQL
select distinct "column1" where "column2" = "value2 and "column3" = "value3
"
column1、column2、colum3 和 values 应该是 REST 调用的参数。
在 postgREST 中,我可能需要使用函数或存储过程,但我对此并不陌生。
你能帮忙吗?
另一种选择是在存储过程中使用动态 sql,并通过使用 pg格式函数非常小心。假设我们有一个projects
表,那么我们创建这个函数:
create function projects(dist name) returns setof projects as $$
begin
return query execute format('select distinct on(%I) * from projects', dist);
end; $$ language plpgsql;
现在您可以在此函数结果上使用所有 PostgREST 过滤器:
## Filtering by a column
curl "localhost:3000/rpc/projects?id=eq.1&dist=name"
## Selecting only certain columns
curl "localhost:3000/rpc/projects?select=id,name&dist=name"
我会创建三个视图:
CREATE VIEW table_dist_column1 AS
SELECT
DISTINCT ON(column1)
column1
, column2
, column3
FROM table;
CREATE VIEW table_dist_column2 AS
SELECT
DISTINCT ON(column2)
column1
, column2
, column3
FROM table;
-- Analogously:
-- CREATE VIEW table_dist_column3 AS ....
然后可以正常使用 PostgREST 过滤器(例如curl "<url>/table_dist_column1?column1=eq.baz&column2=eq.foo&column3=eq.bar"
)。
也可以使用带有动态 sql(使用quote_ident
)的单个 plpgsql 存储过程来完成。但我不建议这样做,因为暴露给最终用户可能很危险。
所以 VIEW 是最好的选择。