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

问题描述

我在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)。或者,如果我真的想保持select调用简单(之所以这样做,是因为我的实际实现更加复杂并且具有多个变量),则可以将视图定义为字符串,并在函数内使用execute(是在构建和创建数据库时使用的所有内部工具,而不是担心动态sql固有的各种风险的情况。

解决方法

否,您不能将变量传递给视图。但是您可以使用以下功能来实现此目的:

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);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...