通过IN子句排序SQL Server结果

时间:2012-01-20 20:19:01

标签: asp.net sql database sql-server-2008 stored-procedures

我有一个使用IN子句的存储过程。在我的ASP.NET应用程序中,我有一个多行文本框,它为存储过程提供值。我希望能够按照在文本框中输入的值进行排序。我在mySQL中找到了如何轻松地做到这一点(使用FIELD函数),而不是SQL Server等价物。

所以我的查询如下:

Select * from myTable where item in @item

所以我会从我的应用程序传递值,如'113113','112112','114114'(以任意顺序)。我想按列表订购结果。

CASE声明是否可行?我不知道文本框数据中有多少项目。

3 个答案:

答案 0 :(得分:5)

您如何参数化IN条款?

当您使用SQL Server 2008时,我会传递一个Table Valued Parameter,其中包含两列itemsort_order,然后加入其中。然后,您只需在末尾添加ORDER BY sort_order

答案 1 :(得分:2)

来自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以及您传入的ID或数字。您当然可以对其进行修改,以便查找空间而不是,值。否则马丁在他的回答中有正确的想法。请注意,在我的示例中,我使用的是其中一个表格,因此您需要将名称Login更改为您正在处理的任何内容。

答案 2 :(得分:1)

与连接('113113','112112','114114')的方式相同,以传递给你可以连接的where clausule中的sql语句

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

通过clausule传递给您的订单