Postgres подзапрос, упорядочение по подзапросу - PullRequest
3 голосов
/ 09 марта 2010

Если у меня есть запрос, такой как:

select * from tbl where id in (10, 20, 9, 4);

возвращенные результаты могут быть в следующем порядке: 4, 9, 10, 20

но что, если нужно было сохранить порядок списка, переданного в исходный запрос? как бы вы подошли к этому?

В конечном счете, я использую Django в качестве ORM для своего приложения здесь, но сначала я хочу выяснить, что выполнимо на уровне БД.

Любые идеи приветствуются!

Ответы [ 3 ]

4 голосов
/ 09 марта 2010

Использование CASE не очень переносимо, потому что вам нужно заранее знать все значения и порядок, который вы хотите отсортировать. Самый простой способ - использовать массив для значений и отсортировать его по индексу элемента в массиве.

Я отправил это в библиотеку фрагментов Postgres некоторое время назад.

CREATE OR REPLACE FUNCTION idx(anyarray, anyelement)
  RETURNS int AS 
$$
  SELECT i FROM (
     SELECT generate_series(array_lower($1,1),array_upper($1,1))
  ) g(i)
  WHERE $1[i] = $2
  LIMIT 1;
$$ LANGUAGE sql IMMUTABLE;

ВЫБРАТЬ * ОТ ФУ ORDER BY idx (массив ['Freshman', 'Sophomore', 'Junior', 'Senior'], foo.grade_level)

0 голосов
/ 09 марта 2010

Взгляните на эту тему , чтобы увидеть, как вы можете создать массив и использовать его для сортировки в функции. Прекрасно работает!

0 голосов
/ 09 марта 2010

Затем вы можете захотеть использовать CASE в выражении ORDER BY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...