Заставить PostgreSQL уважать порядок введенных параметров? - PullRequest
5 голосов
/ 13 февраля 2010

Этот вопрос имеет небольшую историю & mdash; Есть ли способ заставить запрос соответствовать порядку введенных параметров?

Я новичок в построении "специализированных" запросов, поэтому я предположил, что если я предоставлю предложение 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, возвращая результаты в том же порядке ?

Ответы [ 3 ]

5 голосов
/ 13 февраля 2010

Результаты запроса будут возвращены в недетерминированном порядке, если вы не укажете предложение 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;
2 голосов
/ 13 февраля 2010

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

0 голосов
/ 30 августа 2013

Другой способ:

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)');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...