1

我是 Postgres 和 postgREST 的新手。我需要从一列接收不同的记录 - 理想情况下可以过滤。

我需要解决的任务是 SQL

select distinct "column1" where "column2" = "value2 and "column3" = "value3"

column1、column2、colum3 和 values 应该是 REST 调用的参数。

在 postgREST 中,我可能需要使用函数或存储过程,但我对此并不陌生。

你能帮忙吗?

4

2 回答 2

1

另一种选择是在存储过程中使用动态 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"
于 2019-11-13T00:39:33.013 回答
1

我会创建三个视图:

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 是最好的选择。

于 2019-09-27T19:08:28.663 回答