Упорядочивание результата запроса по списку значений - PullRequest
6 голосов
/ 02 декабря 2009

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

select * 
from ProductGroups
where GroupID in (24,12,7,14,65)

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

Я бы хотел упорядочить результаты по этому списку. Мне нужен только первый результат, но в этом случае это может быть результат с GroupId 7.

Я не могу запросить как

order by (24,12,7,14,65).indexOf(GroupId)

Кто-нибудь знает, как это сделать?

Дополнительная информация:
Создание объединения работает и запускается в редакторе запросов mssql, но ...

Из-за ограничений программного обеспечения, отправляющего запрос в mssql, я должен передать его какому-либо внутреннему конструктору запросов как 1 параметр, то есть «24,12,7,14,65». И я не знаю заранее, сколько чисел будет в этом списке, может быть 2, может быть 20.

Ответы [ 4 ]

11 голосов
/ 02 декабря 2009

Вы также можете заказать на случай:

select * 
from ProductGroups
where GroupID in (24,12,7,14,65)
order by case GroupId 
    when 7 then 1 -- First in ordering
    when 14 then 2 -- Second
    else 3
end
7 голосов
/ 02 декабря 2009

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

declare @rank table (
    ordering int identity(1,1)
    , number int    
    )

insert into @rank values (24)
insert into @rank values (12)
insert into @rank values (7)
insert into @rank values (14)
insert into @rank values (65)

select  pg.*
from    ProductGroups pg
left outer join 
    @rank r
on  pg.GroupId = r.number 
order by 
    r.ordering
4 голосов
/ 02 декабря 2009

Я думаю, что мог бы найти возможное решение (но это уродливо):

select * 
from ProductGroups
where GroupID in (24,12,7,14,65)
order by charindex(
             ','+cast(GroupID as varchar)+',' ,
             ','+'24,12,7,14,65'+',')

это упорядочит строки по позиции, в которой они находятся в списке. И я могу передать строку так, как мне нужно.

2 голосов
/ 02 декабря 2009

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

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