Создание PostgreSQL уважает порядок введенных параметров?

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

Я новичок в создании «специализированных» запросов, поэтому я предположил, что если я поставлю предложение IN как часть запроса SELECT , он вернет результаты в том же порядке. К сожалению, это не так.

 SELECT * FROM artists WHERE id IN (8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37) >>> [7, 32, 3, 8, 4, 2, 31, 9, 37, 13, 16, 1, 5, 15, 14] 

(Не включал шаг, на котором я использовал Python для прокрутки результата и добавления идентификаторов в список.)

Итак, вопрос в том, есть ли способ заставить Postgres уважать упорядочение параметров, заданных в предложении IN , возвращая результаты в один и тот же порядок?

Результаты запроса будут возвращены в недетерминированном порядке, если вы не укажете предложение ORDER BY .

Если вы действительно хотите выполнить запрос так, как вы запрашиваете, вы можете построить такой пункт. Вот пример использования части ваших данных.

 create table artists ( id integer not null primary key, name char(1) not null); insert into artists values (8, 'a'), (1, 'b'), (2, 'c'), (15, 'd'), (14, 'e'), (3, 'f'), (13, 'g'); select * from artists where id in (8, 1, 2, 15, 14, 3, 13) order by id = 8 desc, id = 1 desc, id = 2 desc, id = 15 desc, id = 14 desc, id = 3 desc, id = 13 desc; 

Основываясь на этом и на вашем другом вопросе, я думаю, что что-то не так с вашей моделью или с тем, как вы пытаетесь это сделать. Возможно, вам следует опубликовать более общий вопрос о том, как делать то, что вы пытаетесь сделать.

Если у вас есть художники и рейтинговые таблицы, вы должны сделать что-то вроде этого (или эквивалент через ваш ORM).

 select a.* from artists a, rankings r where a.id = r.artist_id order by r.score desc; 

Я предлагаю вам позволить PostGreSQL возвращать набор в любом произвольном порядке (тем более, что трудно выполнить мелкомасштабный контроль уровня SQL из интерфейса Django), а затем сортировать его так, как вы хотите в Pythontheresultset.sort(key=yourlistofids.index) должен делать все возможное (когда theresultset является theresultset произвольного порядка в базе данных, а yourlistofids – это список, порядок которого вы хотите сохранить).

Другой путь:

 SELECT * FROM artists WHERE id IN (8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37) ORDER BY POSITION(id::text in '(8, 1, 2, 15, 14, 3, 13, 31, 16, 5, 4, 7, 32, 9, 37)');