У меня есть таблица в 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?
Большое спасибо Ричард
Это будет доступно в 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;
Пробовали ли вы использовать generate_series()
для массива, а затем сделать SELECT...ORDER BY
для этого результата (или просто вложить его внутрь SELECT
), прежде чем преобразовывать его в строку?
Хотя ответ Мэтью Вуда лучше для вашего случая, вот способ сортировки массивов в 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.