Как сохранить порядок элементов при выборе по идентификатору? - PullRequest
1 голос
/ 01 марта 2011

У меня есть запрос идентификаторов, таких как ids={1000,50,300,40} Я хочу выбрать некоторые элементы с этими идентификаторами из таблицы БД и хочу сохранить последовательность элементов в соответствии с последовательностью идентификаторов.Я имею в виду, я использую выбранную оценку:

SELECT * 
  FROM items 
 WHERE id IN (1000,50,300,40)

И я хотел бы получить результат как

id      name
-------------
1000   item1
50     item2
300    item3
40     item4

Но SQL возвращает результат как

id      name 
-------------
40     item4 
50     item2 
300    item3 
1000   item1

ЭтоОчень важно сохранить порядок идентификаторов.Кто-нибудь может мне помочь?

Ответы [ 5 ]

5 голосов
/ 01 марта 2011

Предполагая SQL Server 2000+, используйте выражение CASE:

  SELECT i.* 
    FROM ITEMS i
   WHERE i.id IN (1000,50,300,40)
ORDER BY CASE i.id
           WHEN 1000 THEN 1
           WHEN 50 THEN 2
           WHEN 300 THEN 3
           WHEN 40 THEN 4
           ELSE 5
         END 
4 голосов
/ 01 марта 2011

У вас также есть проблема с параметризацией предложения in.Если вы используете SQL Server 2008, вы можете использовать табличные параметры.Вы можете использовать TVP с 2 столбцами и столбцом order by и столбцом value, а затем присоединиться к нему.

Для предыдущих версий вы можете использовать функцию split Table Valued, которая возвращает 2 столбца (index и value) и присоединитесь к этому.

SELECT i.*    
FROM dbo.split('1000,50,300,40') s
JOIN items i ON i.id = s.value
ORDER BY s.idx

Пример такой функции здесь .Я никоим образом не одобряю эту конкретную реализацию, поскольку есть , вероятно, гораздо лучше , но вы можете использовать ее, чтобы увидеть общий подход.

1 голос
/ 01 марта 2011

Единственное, о чем я могу думать, - это разработать или обнаружить какой-то другой столбец, который будет возвращать объекты в правильном порядке, или UNION серию запросов по индивидуальному идентификатору, что приведет к добавлению каждого результата запроса по порядку ко всемпредыдущие наборы результатов.

Причина, по которой это происходит, заключается в том, что механизм SQL выполняет сканирование индекса или таблицы, чтобы найти записи, и поскольку записи обычно хранятся в порядке их идентификаторов, это порядок по умолчанию.найдет их и добавит в набор результатов.

0 голосов
/ 01 марта 2011

использование

select * from items WHERE id IN (1000,50,300,40) order by id desc
0 голосов
/ 01 марта 2011

Добавьте в запрос предложение ORDER BY с ASC или DESC для возрастания или убывания соответственно.

select * from items where id in (1000,50,300,40) order by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...