2013-05-05 3 views
1

У меня есть запрос, подобный приведенному ниже, и я хочу, чтобы записи возвращались в том же порядке, что и идентификаторы внутри функции «in».Сортировка столбцов на основе порядка внутри SQL в функции

SELECT * FROM table 1 where id in(12,6,4,3,13) 

Могу ли я сделать это с использованием только sql или мне нужно написать свою собственную функцию сортировки.

+0

Вставка их в таблицу параметров temp или table с двумя столбцами. 'id' и' SortOrder' и присоединяться, а не использовать 'in'. Затем вы можете просто заказать второй столбец. –

ответ

2

вы можете использовать CASE для пользовательских сортировок записей,

ORDER BY CASE WHEN ID = 12 THEN 1 
       WHEN ID = 6 THEN 2 
       WHEN ID = 4 THEN 3 
       WHEN ID = 3 THEN 4 
       WHEN ID = 13 THEN 5 
       ELSE 6 
     END, ID 
+0

thats штраф на сейчас. Но у меня есть запрос моего собственного, если 'in' list не фиксирован, чем есть способ, который мы можем сортировать по списку? –

+0

- решение масштабируемое? сказать, как 100-10 тыс. идентификаторов? – thunderbird

+0

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

3

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

Предположительно, если у вас есть идентификатор 10k, они не будут введены вручную, поэтому, возможно, возможно построить сортировку/объединение таблицы по-другому. Также должны быть более эффективными, чем при использовании большого in

create table #tempID(idSort int identity(1,1), id int) 
insert into #tempID(id) 
select 12 union all 
select 6 union all 
select 4 union all 
select 3 union all 
select 13 

select * from table t1 
    inner join #tempID t2 
     on t1.id = t2.id 
order by t2.idSort 

Для создания сортировки таблицы динамически, вам нужна эта функция (или аналогичный):

create FUNCTION [dbo].[comma_sep_var_intSort] (@list nvarchar(MAX)) 
    RETURNS @tbl TABLE (idSort int identity(1,1), id int NOT NULL 
) AS 
BEGIN 
    DECLARE @pos  int, 
      @nextpos int, 
      @valuelen int 

    SELECT @pos = 0, @nextpos = 1 

    WHILE @nextpos > 0 
    BEGIN 
     SELECT @nextpos = charindex(',', @list, @pos + 1) 
     SELECT @valuelen = CASE WHEN @nextpos > 0 
           THEN @nextpos 
           ELSE len(@list) + 1 
         END - @pos - 1 
     INSERT @tbl (id) 
     VALUES (cast(substring(@list, @pos + 1, @valuelen) as int)) 
     SELECT @pos = @nextpos 
    END 
    RETURN 
END 

Тогда присоединиться, как это:

declare @idList varchar(max) 

set @idLIst = '12,6,4,3,13' 

    select * from table t1 
     inner join [dbo].[comma_sep_var_int](@idList) t2 
      on t1.id = t2.id 
    order by t2.idSort 
+0

+1 для того, чтобы сделать его почти динамическим –

+0

Если вы хотите его динамического, вам, вероятно, нужна функция. – dantibb

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