首页 > 解决方案 > PostgreSQL:在where子句中使用函数参数

问题描述

我想创建一个使用 filter-parameter 的函数,稍后将其应用于 where 子句。

到目前为止,我的函数定义如下:

CREATE OR REPLACE FUNCTION function_to_be_fixed(filter_date date)                   
RETURNS void as  $$
Begin
  CREATE OR REPLACE VIEW view_to_create.randomname AS
  SELECT * from other_table where date_col <= filter_date
End;
$$ LANGUAGE plpgsql;

通过调用函数时

 select function_to_be_fixed(filter_date   => '2020-01-01');

我收到错误:“filter_date”列不存在。

为了让它运行,我需要调整什么?

标签: postgresqlfunctionviewparameters

解决方案


您不能在视图定义中使用这样的参数。

创建视图后,参数将“丢失”。

您需要为此使用动态 SQL,以便将参数的值替换为定义视图的 SQL 字符串:

CREATE OR REPLACE FUNCTION function_to_be_fixed(filter_date date)                   
RETURNS void as  $$
Begin
  execute format('
    CREATE OR REPLACE VIEW view_to_create.randomname AS
    SELECT * from other_table where date_col <= %L', filter_date);
End;
$$ LANGUAGE plpgsql;

您将 filter_date 传递给的单个函数将是一个更好的解决方案:

create or replace function get_some_table_data(filter_date date)
  returns setof some_table
as
$$
  select *
  from some_table
  where date_col <= filter_date;
$$
language sql;

推荐阅读