postgresql - 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”列不存在。
为了让它运行,我需要调整什么?
解决方案
您不能在视图定义中使用这样的参数。
创建视图后,参数将“丢失”。
您需要为此使用动态 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;
推荐阅读
- php - Memcache 中存储了多少数据
- java - 在 Android Studio 中不使用 Instant Run 时出现 Firebase DatabaseException
- python - python单元素元组
- postgresql - 从数据库快照 PostgreSQL AWS 自动恢复数据库
- javascript - IE:使用 AJAX 发送 POST 数据
- android - 如何在 onTouch 方法中获取 GesturDetector.onSingleTapConfirmed() 返回值?
- jpa - JPA 垂头丧气:标准治疗与 JPQL 治疗
- vue.js - 本地副本更新时 vueJS-prop 正在发生变化
- javascript - Dojo 2 dojo2 中是否有渲染后的生命周期挂钩?
- c# - 签署一个xml元素c#