如何在 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 函数中几乎重复查询