Если вы ищете решение, которое будет работать с любым типом данных, я бы рекомендовал использовать подход, изложенный по адресу YouLikeProgramming.com .
По сути, вы можете создать хранимую процедуру (код ниже), которая выполняет сортировку для вас, и все, что вам нужно сделать, это передать массив в эту процедуру, чтобы он был отсортирован надлежащим образом.
Я также включил реализацию, которая не требует использования хранимой процедуры, если вы ищете, чтобы ваш запрос был немного более транспортабельным.
Создание хранимой процедуры
DROP FUNCTION IF EXISTS array_sort(anyarray);
CREATE FUNCTION
array_sort(
array_vals_to_sort anyarray
)
RETURNS TABLE (
sorted_array anyarray
)
AS $BODY$
BEGIN
RETURN QUERY SELECT
ARRAY_AGG(val) AS sorted_array
FROM
(
SELECT
UNNEST(array_vals_to_sort) AS val
ORDER BY
val
) AS sorted_vals
;
END;
$BODY$
LANGUAGE plpgsql;
Сортировка значений массива (работает с любым типом данных массива)
-- The following will return: {1,2,3,4}
SELECT ARRAY_SORT(ARRAY[4,3,2,1]);
-- The following will return: {in,is,it,on,up}
SELECT ARRAY_SORT(ARRAY['up','on','it','is','in']);
Сортировка значений массива без хранимой процедуры
В следующем запросе просто замените ARRAY[4,3,2,1]
на ваш массив или запрос, который возвращает массив:
WITH
sorted_vals AS (
SELECT
UNNEST(ARRAY[4,3,2,1]) AS val
ORDER BY
val
)
SELECT
ARRAY_AGG(val) AS sorted_array
FROM
sorted_vals
... или ...
SELECT
ARRAY_AGG(vals.val) AS sorted_arr
FROM (
SELECT
UNNEST(ARRAY[4,3,2,1]) AS val
ORDER BY
val
) AS vals