这有效:
CREATE OR REPLACE FUNCTION avg_purchases(last_names text[] = '{}')
RETURNS TABLE(last_name text, avg_purchase_size float8) AS
$func$
SELECT last_name, AVG(purchase_size)::float8
FROM purchases
WHERE last_name = ANY($1)
GROUP BY last_name
$func$ LANGUAGE sql;
称呼:
SELECT * FROM avg_purchases('{foo,Bar,baz,"}weird_name''$$"}');
或者(更新 - 以美元报价为例):
SELECT * FROM avg_purchases($x${foo,Bar,baz,"}weird_name'$$"}$x$);
VARIADIC
数组是一种有用的输入类型。如果您的客户更容易,您还可以使用VARIADIC
允许将数组作为元素列表传递的输入参数:
CREATE OR REPLACE FUNCTION avg_purchases(VARIADIC last_names text[] = '{}')
RETURNS TABLE(last_name text, avg_purchase_size float8) AS
$func$
SELECT last_name, AVG(purchase_size)::float8
FROM purchases
JOIN (SELECT unnest($1)) t(last_name) USING (last_name)
GROUP BY last_name
$func$ LANGUAGE sql;
称呼:
SELECT * FROM avg_purchases('foo', 'Bar', 'baz', '"}weird_name''$$"}');
或者(使用美元报价):
SELECT * FROM avg_purchases('foo', 'Bar', 'baz', $y$'"}weird_name'$$"}$y$);
请注意,标准 Postgres最多只允许 100 个元素。这是在编译时由预设选项确定的:
max_function_args (integer)
报告函数参数的最大数量。由FUNC_MAX_ARGS
搭建服务器时的值决定。默认值为 100 个参数。
当前缀为关键字时,您仍然可以使用数组表示法调用它VARIADIC
:
SELECT * FROM avg_purchases(VARIADIC '{1,2,3, ... 99,100,101}');
对于更大的数组(100+),我也会unnest()
在子查询中使用JOIN
它,它往往可以更好地扩展: