2011-07-07 2 views
17

Я следующий запрос, который возвращает строки на основе запятыми списокSQL - заказ по списку заказа

Select * from Table where RecordID in (22,15,105,1,65,32) 

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

Заранее благодарен

+0

Что базы данных SQL системы, или вам нужно что-то портативное? –

ответ

10

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

E.g. (SQL Server)

declare @T table (RecordID int,Position int) 
insert into @T (RecordID,Position) 
select 22,1 union all 
select 15,2 union all 
select 105,3 union all 
select 1,4 union all 
select 65,5 union all 
select 32,6 

select * from Table t inner join @T t2 on t.RecordID = t2.RecordID order by t2.Position 
+0

Большое спасибо, работает. – twsJames

0

Да. В конце вы добавляете предложение ORDER BY recordedid.

+2

Я не думаю, что вы поняли: он хочет, чтобы тот же * порядок, как в запросе – Bohemian

+0

, вы правы, мне это было непонятно. – nabuchodonossor

-3

Использование ORDER BY против RecordID

Select * from Table where RecordID in (22,15,105,1,65,32) ORDER BY RecordID 
+0

Привет, Talha, мне бы хотелось, чтобы записи были заказаны в том же порядке, что и список. например Запись 1 = id 22, Запись 2 = id 15 и т. Д. Возможно ли это – twsJames

14
select * from Table 
where RecordID in (22,15,105,1,65,32) 
order by (
    case RecordID 
     when 22 then 1 
     when 15 then 2 
     when 105 then 3 
     when 1 then 4 
     when 65 then 5 
     when 32 then 6 end) 
+0

RecordId будет динамическим списком (забыли упомянуть об этом) – twsJames

+0

@twsJames - Поскольку ваше утверждение выглядит так: '(22,15,105,1,65 , 32) 'вы уже строите свой запрос динамически, так что вы можете также построить' order by' в одно и то же время. Если нет, как вы параметризуете свой запрос с помощью динамического списка значений? –

+0

Это сработало для меня, отлично! Благодарю. –

-1

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

select * from Table where RecordID = 22 
union all 
select * from table where recordid = 15 

и т.д.

It была боль, но это сработало.

+1

Гарантийные гарантии от UNION или UNION ALL не предоставляются - двигатель может возвращать результаты в любом порядке, который он считает наиболее эффективным. Это может, случайно, вернуть результаты в запрошенном порядке, но все (изменение основной версии, пакет обновления, исправление, рабочая нагрузка на сервер, время суток, фаза луны, цвет вашей рубашки) могут означать, что результаты возвращаются в другой заказ. –

+0

Для этого вам нужно добавить последовательное значение для каждого SELECT, например. SELECT [rank] = 1, * FROM Таблица WHERE ... UNION ALL SELECT [rank] = 2, * FROM Таблица WHERE ... ORDER BY [rank]. Конечно, это может стать довольно дорогостоящим в зависимости от того, что еще может понадобиться в предложении WHERE, неважно, нужны ли соединения с другими таблицами, поэтому я, конечно, не рекомендую этот подход. Это боль по нескольким причинам. –

+0

Справедливо, похоже, мне просто повезло, когда я это сделал. – DoctorMick

2

Я бы упорядочению в клиенте, но если вы действительно хотите сделать это в SQL, сделать это следующим образом:

declare @T table (id int identity(1,1), RecordID int) 

insert into @T (RecordID) 
values (22), (15), (105), (1), (65), (32) 

select * from 
[table] t 
inner join @t s on t.id=s.recordid 
where t.id in (22, 15, 105, 1, 65, 32) 
order by s.id 

(работает в SQL Server 2008)

+0

Я не могу найти никакой документации в любом случае о том, будет ли соблюден порядок строк в конструкторе значения таблицы инструкции insert w.r.t. ИДЕНТИФИКАЦИЯ значений. Это заставляет меня нервничать. –

+0

Это уважение. В противном случае вы всегда можете делать это один за другим. –

Смежные вопросы