Re: Largest & Smallest Functions

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: Largest & Smallest Functions
Дата
Msg-id CAFj8pRDzWkgMh2TReeprCcXVBEpmVd6TvUhLG9THvmSCvTzDGA@mail.gmail.com
обсуждение исходный текст
Ответ на Largest & Smallest Functions  (Ken Tanzer <ken.tanzer@gmail.com>)
Ответы Re: Largest & Smallest Functions  (Ken Tanzer <ken.tanzer@gmail.com>)
Re: Largest & Smallest Functions  (Andrew Gierth <andrew@tao11.riddles.org.uk>)
Список pgsql-general


st 7. 11. 2018 v 22:38 odesílatel Ken Tanzer <ken.tanzer@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
(253) 245-3801

learn more about AGENCY or
follow the discussion.

В списке pgsql-general по дате отправления:

Предыдущее
От: David Rowley
Дата:
Сообщение: Re: Postgres 11.0 Partitioned Table Query Performance
Следующее
От: Ken Tanzer
Дата:
Сообщение: Re: Largest & Smallest Functions