如何在 Postgres/plpgsql 中的视图定义中使用变量

sus*_*ins 1 sql postgresql view plpgsql

我将 plpgsql 与 Postgres 10.6 一起使用。我有一个函数声明变量并为其赋值。该函数还定义了一个视图,我想在定义中使用该变量。

  create view myview as
    select
      some_columns
    from
      mytable
    where      
      id = _id     /*_id is declared earlier in function */
  ;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可以定义该函数,但运行时会出现错误:UndefinedColumn: column "_id" does not exist

在 Postgres 中这样的事情可能吗?视图可以包含变量作为其定义的一部分吗?

我确实在这里看到,在 BigQuery (我从未使用过)中,我所要求的是不可能的,这让我认为这在 plpgsql 中也可能是不可能的。

这没什么大不了的,但我很好奇。一种解决方法 - 可能也是推荐的解决方案 - 是当我从视图中选择时传递 _id (例如select * from myview where id = 3)。或者,如果我真的想让 select 调用保持简单(我这样做,因为我的实际实现更复杂并且有多个变量),我可以将视图定义为字符串并execute在函数中使用(这是所有使用的内部内容)在构建和创建数据库时,而不是在担心动态 sql 固有的各种风险的情况下)。

小智 7

不,您不能将变量传递给视图。但你可以用一个函数来做到这一点:

create function my_view_function(p_id integer)
  returns table (id int, column_1 int, column2 text)
as
$$
  select id, column_1, column_2
  from my_table
  where id = p_id;
$$
language sql
stable;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

select *
from my_view_function(42);
Run Code Online (Sandbox Code Playgroud)