pl / pgSQL-“ WHERE IN”子句中使用的参数的正确数据?

时间:2019-06-25 14:44:16

标签: postgresql plpgsql

我正在尝试创建一个PL / pgSQL函数,该函数接受一个数组(数组)/值(属性)列表,这些数组/列表将使用“ IN”子句来过滤记录。

CREATE OR REPLACE FUNCTION ticket.property_report(start_date DATE, end_date DATE, properties VARCHAR[]) RETURNS 
TABLE(total_labor_mins numeric(10,2), total_parts_cost numeric(10,2), ticket_count bigint, property VARCHAR(6)) AS $$ 
BEGIN
    RETURN QUERY SELECT SUM(c.total_labor_mins), SUM(c.total_parts_cost), COUNT(*) as ticket_count, t.property_id as property
      FROM ticket.ticket AS t LEFT JOIN ticket.ticket_cost_row AS c ON t.id = c.ticket_id 
      WHERE t.property_id IN (properties) AND t.open_date >= start_date AND t.open_date <= end_date
      GROUP BY t.property_id;

END;
$$ LANGUAGE plpgsql;

但是,我正在努力在参数列表中使用哪种类型的数据类型。单个“ varchar”不合适,因为可能有许多属性值。但是,无论何时使用数组(如上面的代码),我都会收到以下消息:

SELECT ticket.property_report(TO_DATE('2019-01-01', 'yyyy-MM-dd'), TO_DATE('2019-12-31', 'yyyy-MM-dd'), '{"5305"}');
ERROR:  operator does not exist: character varying = character varying[]
LINE 3:       WHERE t.property_id IN (properties) AND t.open_date >=...
                                  ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY:  SELECT SUM(c.total_labor_mins), SUM(c.total_parts_cost), COUNT(*) as ticket_count, t.property_id as property
      FROM ticket.ticket AS t LEFT JOIN ticket.ticket_cost_row AS c ON t.id = c.ticket_id
      WHERE t.property_id IN (properties) AND t.open_date >= start_date AND t.open_date <= end_date
      GROUP BY t.property_id
CONTEXT:  PL/pgSQL function ticket.property_report(date,date,character varying[]) line 3 at RETURN QUERY

用于此目的的属性数据类型是什么。例如,可以翻译成WHERE t.property_id IN ('123','12','1',...)的东西吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

该数组是正确的数据类型,您只需要使用适用于该数组的operator

WHERE t.property_id = ANY (properties)