Часто бывает надо получить максимальное или минимальное значение из набора данных. Есть два решения, которые можно использовать в том или ином случае.
Надо оформить набор значений в виде массива и получить искомое значение запросом с использование агрегирующей функции min или max:
SELECT max(el) FROM unnest(array[2,3,1,7,4]) AS el;
max
-----
7
(1 row)
Данное значение очень громоздкое, но, наверное, одно из самых быстрых решения данной задачи.
В PostgreSQL существуют встроенные функции, которые принимают на вход произвольный набор параметров и возвращают либо минимальное, либо максимальное значение из этого набора:
SELECT least(2,3,1,7,4);
least
-------
1
(1 row)
SELECT greatest(2,3,1,7,4);
greatest
----------
7
(1 row)
least или greatest может заменить громоздкие конструкции CASE WHEN
WITH tbl AS (SELECT 1 AS a, 2 AS b UNION SELECT 4, 3)
SELECT *, CASE WHEN a > b THEN a ELSE b END AS max_value FROM tbl;
a | b | max_value
---+---+-----------
1 | 2 | 2
4 | 3 | 4
(2 rows)
WITH tbl AS (SELECT 1 AS a, 2 AS b UNION SELECT 4, 3)
SELECT *, greatest(a, b) AS max_value FROM tbl; -- Замена CASE WHEN на GREATEST сделал записис более короткой и понятной
a | b | max_value
---+---+-----------
1 | 2 | 2
4 | 3 | 4
(2 rows)
и IF THEN ELSE
CREATE OR REPLACE FUNCTION max(_a int4, _b int4) RETURNS int4 AS
$$
BEGIN
IF _a > _b THEN
RETURN _a;
ELSE
RETURN _b;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION max(_a int4, _b int4) RETURNS int4 AS
$$
SELECT greatest(_a, _b); -- Лакончиность и простота
$$ LANGUAGE sql;