Сортировка текстового агрегата, созданного с помощью array_agg в postgresql

У меня есть таблица в postgresql. Следующая таблица "animals" поможет объяснить мою проблему:

name
------
tiger
cat
dog

Теперь я я использую следующий запрос:

SELECT
    array_to_string(array_agg("name"), ', ')
FROM
    animals;

Результат: «тигр, кот, собака». Но я хотел бы отсортировать агрегат, прежде чем он будет преобразован в строку. Так что это результат, на который я надеюсь:

"cat, dog, tiger".

Итак, как я могу отсортировать массив строк в postgresql 8.4 перед преобразованием его в строку. ORDER BY в строке "name" не работает, а встроенная функция сортировки обрабатывает только целочисленные значения.

Всем хорошая идея, как решить эту проблему на чистом SQL?

Большое спасибо Ричард

24
задан kovpack 10 August 2017 в 08:19
поделиться

3 ответа

Это будет доступно в PostgreSQL 9.0:

http://www.postgresql.org/docs/9.0/static/release-9-0.html , Раздел E .1.3.6.1. Агрегаты

А пока вы можете сделать что-то вроде этого, что может решить проблему (хотя и неуклюже):

SELECT array_agg(animal_name)
FROM (
    SELECT "name" AS animal_name
    FROM animals
    ORDER BY "name"
) AS sorted_animals;
14
ответ дан 28 November 2019 в 22:29
поделиться

Пробовали ли вы использовать generate_series() для массива, а затем сделать SELECT...ORDER BY для этого результата (или просто вложить его внутрь SELECT), прежде чем преобразовывать его в строку?

0
ответ дан 28 November 2019 в 22:29
поделиться

Хотя ответ Мэтью Вуда лучше для вашего случая, вот способ сортировки массивов в PostgreSQL 8.4 и выше:

SELECT array(
    SELECT unnest(array[3,2,1]) AS x ORDER BY x
);

Зная массив и unnest функции могут быть удобными, так как они также позволяют вам делать такие вещи, как "map" над массивом:

SELECT array(
    SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery
);

Опять же, это может быть ваше по цене PostgreSQL 8.4.

4
ответ дан 28 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: