Упорядочивание результатов SQL Server по предложению IN - PullRequest
8 голосов
/ 21 января 2012

У меня есть хранимая процедура, которая использует предложение IN.В моем приложении ASP.NET у меня есть многострочное текстовое поле, которое предоставляет значения для хранимой процедуры.Я хочу иметь возможность упорядочить по значениям, как они были введены в текстовом поле.Я узнал, как это легко сделать в mySQL (используя функцию FIELD), но не в эквиваленте SQL Server.

Итак, мой запрос выглядит следующим образом:

Select * from myTable where item in @item

Так что я буду передаватьзначения из моего приложения, такие как «113113», «112112», «114114» (в произвольном порядке).Я хочу упорядочить результаты по этому списку.

Возможно ли утверждение CASE?Я не знаю, сколько элементов поступает в данных текстового поля.

Ответы [ 3 ]

5 голосов
/ 21 января 2012

Как вы параметризуете условие IN?

Поскольку вы работаете на SQL Server 2008, я бы передал Табличный параметр с двумя столбцами item и sort_orderи присоединиться к этому вместо этого.Тогда вы можете просто добавить ORDER BY sort_order в конец.

2 голосов
/ 21 января 2012

Из комментария KM выше ...

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

DECLARE @SomeTest varchar(100) --used to hold your values
SET @SomeTest = (SELECT '68,72,103') --just some test data

SELECT 
    LoginID --change to your column names
FROM 
    Login   --change to your source table name
INNER JOIN
(   SELECT 
    * 
    FROM fn_IntegerInList(@SomeTest)
) n
ON 
    n.InListID = Login.LoginID
ORDER BY 
    n.SortOrder

И затем создайте fn_IntegerInList():

CREATE FUNCTION [dbo].[fn_IntegerInList] (@InListString ntext)
RETURNS @tblINList TABLE (InListID int, SortOrder int)
AS
BEGIN
declare @length int
declare @startpos int
declare @ctr int
declare @val nvarchar(50)
declare @subs nvarchar(50)
declare @sort int

set @sort=1
set @startpos = 1
set @ctr = 1
select @length = datalength(@InListString)

while (@ctr <= @length)
begin
   select  @val = substring(@InListString,@ctr,1)

   if @val = N',' 
     begin
        select @subs = substring(@InListString,@startpos,@ctr-@startpos)
        insert into @tblINList values (@subs, @sort)
        set @startpos = @ctr+1
     end
  if @ctr = @length 
      begin
        select @subs = substring(@InListString,@startpos,@ctr-@startpos)
        insert into @tblINList values (@subs, @sort)
      end
  set @ctr = @ctr +1
  set @sort = @sort + 1
end
RETURN
END

Таким образом, ваша функция создает таблицу, которая содержит порядок сортировки, а именно SortOrder и идентификатор или номер, который вы передаете.Конечно, вы можете изменить это так, чтобы вы искали пробел вместо , значений.В противном случае Мартин имеет правильную идею в своем ответе.Обратите внимание, что в моем примере я использую одну из моих таблиц, поэтому вам нужно изменить имя Login на любое, с чем вы имеете дело.

1 голос
/ 21 января 2012

аналогично тому, как вы соединяете ('113113', '112112', '114114') для передачи в предложение sql в предложении where, вы можете объединить

order by
case item    
when '113113' then 1
when '112112' then 2
when '114114' then 3
end

для передачи в ваш заказ по clausule

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