pl / pgSQL - правильные данные для параметра, используемого в предложении "WHERE IN"? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать функцию 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 Ответ

3 голосов
/ 25 июня 2019

Массив имеет правильный тип данных, вам просто нужно использовать оператор , который работает с этим:

WHERE t.property_id <b>= ANY</b> (properties)
...