st 7. 11. 2018 v 22:38 odesílatel Ken Tanzer <ken.tan...@gmail.com> napsal:
> Hi. Building on the [type]_larger and _smaller functions (and lifting > from the documentation), I put together a couple of functions that will > take any number of arguments: > > CREATE FUNCTION largest(VARIADIC anyarray) RETURNS anyelement AS $$ > SELECT max($1[i]) FROM generate_subscripts($1, 1) g(i); > $$ LANGUAGE SQL IMMUTABLE; > > CREATE FUNCTION smallest(VARIADIC anyarray) RETURNS anyelement AS $$ > SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i); > $$ LANGUAGE SQL IMMUTABLE; > > > So far so good. I can do smallest(2,4,7), etc. But to take this a > convenient step further, sometimes I want the smallest or largest from > values already in an array. So I can create these functions: > > CREATE FUNCTION largest_from_array(anyarray) RETURNS anyelement AS $$ > SELECT max($1[i]) FROM generate_subscripts($1, 1) g(i); > $$ LANGUAGE SQL IMMUTABLE; > > CREATE FUNCTION smallest_from_array(anyarray) RETURNS anyelement AS $$ > SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i); > $$ LANGUAGE SQL IMMUTABLE; > > That works, but ideally I'd like both of these function sets to have the > same name, and work whether called with an array or a set of values. I > tried with > > CREATE FUNCTION largest(VARIADIC anynonarray) > > but get: > > ERROR: VARIADIC parameter must be an array > > > So here's my questions: > > 1) Is there any way to collapse those four functions into two? (Or is > there a better way to go about this?) > > 2) Is there any particular reason functions like that aren't built into > Postgres? They seem like they would be useful. (Or maybe I missed them?) > The variadic parameters should not be a arrays - can be of "any" type. But this functionality is available only for C language functions. > 3) Bonus question--how come all the existing _larger and _smaller > functions are specific to each data type, as opposed to more general > smaller/larger functions? > You can pass variadic arguments as a array postgres=# \sf smallest CREATE OR REPLACE FUNCTION public.smallest(VARIADIC anyarray) RETURNS anyelement LANGUAGE sql IMMUTABLE AS $function$ SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i); $function$ postgres=# select smallest(VARIADIC ARRAY[1,2,3]); ┌──────────┐ │ smallest │ ╞══════════╡ │ 1 │ └──────────┘ (1 row) > > TIA! > > Ken > > > > -- > AGENCY Software > A Free Software data system > By and for non-profits > *http://agency-software.org/ <http://agency-software.org/>* > *https://demo.agency-software.org/client > <https://demo.agency-software.org/client>* > ken.tan...@agency-software.org > (253) 245-3801 > > Subscribe to the mailing list > <agency-general-requ...@lists.sourceforge.net?body=subscribe> to > learn more about AGENCY or > follow the discussion. >