2009-12-02 3 views
5

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

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

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

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

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

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

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

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

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

+0

Мог бы вы иметь параметр, переданный как xml, и затем вы могли бы захватывать значения динамически? – Unsliced

+0

Проблема с этим списком значений заключается в том, что он используется в другом месте в моем приложении. Я могу внести небольшие изменения в него, прежде чем передавать его в качестве параметра, например, изменить ',' на ''. Инструмент dev (WebDev12) использует некоторую замену строк для построения запросов, поэтому {Parameter} будет заменен значением, которое я предоставляю. – Sorskoot

ответ

6

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

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 
+0

Спасибо, я чувствую, что я почти закончил ... – Sorskoot

+1

Отлично! Чтобы облегчить жизнь, с SQL Server 2018 вы можете сделать: INSERT INTO @rank (number) VALUES (24), (12), (7), (14), (65). Таким образом, вы сохраняете немного INSERT и лучше управляете большим списком значений;) –

2

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

7

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

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 
4

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

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

это прикажет строки по положению, которое они встречаются в списке. И я могу передать строку, как мне тоже нужно.

+0

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

+0

Спасибо! Я не эксперт по sql, но я рассмотрю его. – Sorskoot

+0

Просто ответ, который я ищу - требует наименьшей работы для реализации списка неизвестных значений и неизвестного размера – Graham

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