首页 > 解决方案 > 将数组传递给postgresql中的函数

问题描述

我有一个表,我想使用函数一次搜索所有记录。但是当我给它输入时,我的函数不显示任何内容。请如果您知道如何编写一个函数来一次获取所有值并打印其结果。我正在与您分享我的桌子和功能,如下所示。

select * from v_payments ;
 entity_name | patient_name | business_entity_id | payment_type_id | entered_date 
-------------+--------------+--------------------+-----------------+--------------
 patient     | ali          |                  1 |               5 | 2020-01-01
 male        | baba         |                  2 |               4 | 2020-02-01
 female      | reshma       |                  7 |               8 | 2020-03-01

它的功能如下

create or replace function get_patient_data (b_entity_id[],p_type_id[],e_date date[]) returns table (
entity_first_name  TEXT,
  patient_first_name TEXT,
  business_entity_id INTEGER,
  payments_type_id  INTEGER,
  entry_date     DATE) as $$
begin
SELECT
  entity_name,
  patient_name,
  business_entity_id,
  payment_type_id,
  entered_date
FROM v_payments
WHERE business_entity_id = ANY($1) and payment_type_id = ANY($2) and entered_date = ($3); end; $$ language plpgsql ;

标签: arrayspostgresqlstored-procedures

解决方案


该功能几乎没有问题。即return query在函数中不存在,您正在date与之比较date[]会引发错误。所以用相同的逻辑修复错误后的函数查询如下所示:

create or replace function get_patient_data (b_entity_id int[],p_type_id int[],e_date date[]) 
returns table (
  entity_first_name  TEXT,
  patient_first_name TEXT,
  business_entity_id INTEGER,
  payments_type_id  INTEGER,
  entry_date     DATE) as $$
begin
return query
SELECT
  entity_name,
  patient_name,
  business_entity_id,
  payment_type_id,
  entered_date
FROM v_payments
WHERE business_entity_id = ANY($1) 
and payment_type_id = ANY($2) 
and entered_date = any($3); 
end; 
$$ 
language plpgsql;

现在你可以像下面这样调用它:

select * from get_patient_data('{1,2}','{5,4}','{''2020-01-01'',''2020-02-01''}')

演示

由于您已将函数的所有参数作为数组,因此您必须像上面一样在数组中提供它。您可以根据您的要求更改条件。


推荐阅读