错误:op ANY / ALL(数组)需要Postgres函数右侧的数组

时间:2016-01-14 09:50:16

标签: postgresql plpgsql

我在PostgreSQL函数中遇到错误,我通过传递两个参数来过滤我的数据.Below是我的函数和表格结构请告诉我在哪里以及我做错了什么

CREATE TABLE table_2(
  id_col text,
  name_col text);

INSERT INTO table_2(id_col, name_col)
VALUES (1, 'A'),(2, 'B'),(3, 'C'),
       (4, 'D'),(5, 'E'),(6, 'F');

CREATE OR REPLACE FUNCTION test_str_1(IN param_name_col text,
                           VARIADIC integer[], OUT id_col text, OUT name_col text)
  RETURNS SETOF record AS
$BODY$
  BEGIN
return query
   SELECT t2.id_col,t2.name_col from table_2 t2
   Where t2.name_col = param_name_col AND t2.id_col::int = ANY($1) ;
  END
$BODY$
  LANGUAGE plpgsql VOLATILE

SELECT test_str_1('A', 1,2,3);

1 个答案:

答案 0 :(得分:1)

您可以使用unnest

CREATE OR REPLACE FUNCTION test_str_1(IN param_name_col text,
                           VARIADIC integer[], OUT id_col text, OUT name_col text)
RETURNS SETOF record AS
$BODY$
BEGIN
   return query
   SELECT t2.id_col,t2.name_col
   from table_2 t2
   Where t2.name_col = param_name_col 
      AND t2.id_col::int IN (SELECT * FROM unnest($2));
END
$BODY$
LANGUAGE plpgsql VOLATILE

SELECT test_str_1('A', 1,2,3);
-- "(1,A)"

或只是将ANY($1)更改为ANY($2)($ 1 - 是第一个参数,$ 2 - 是第二个):

CREATE OR REPLACE FUNCTION test_str_1(IN param_name_col text,
                              VARIADIC integer[], OUT id_col text, OUT name_col text)
RETURNS SETOF record AS
$BODY$
BEGIN
   return query
   SELECT t2.id_col,t2.name_col
   from table_2 t2
   Where t2.name_col = param_name_col 
      AND t2.id_col::int = ANY($2);
END
$BODY$
LANGUAGE plpgsql VOLATILE

SELECT test_str_1('A', 1,2,3);
-- "(1,A)"

$1是值为'A'的第一个参数,ANY需要类型为array($2)的参数。