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

Posted

技术标签:

【中文标题】如何在 Postgres/plpgsql 的视图定义中使用变量【英文标题】:How to use variable in view definition in Postgres/plpgsql 【发布时间】:2020-08-11 03:19:28 【问题描述】:

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

  create view myview as
    select
      some_columns
    from
      mytable
    where      
      id = _id     /*_id is declared earlier in function */
  ;

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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;

那就这样用吧

select *
from my_view_function(42);

【讨论】:

感谢您给出明确的“不,您不能将变量传递给视图”的答案。此外,您的解决方案是完成我想要做的事情的好解决方案。谢谢。

以上是关于如何在 Postgres/plpgsql 的视图定义中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

避免在 postgres plpgsql 函数中几乎重复查询

在 postgres plpgsql 函数中重用 json 解析的输入

滚动时如何在 UIScrollView 中固定图像/视图

如何在 Xcode 中指定表单完成后要加载的视图?

如何在 Joomla 控制器中指定视图列表?

如何在 SceneKit 的场景视图中为阴影正确添加定向光?