【问题标题】:Ordering SQL Server results by IN clause按 IN 子句对 SQL Server 结果排序
【发布时间】:2012-02-15 08:53:15
【问题描述】:

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

所以我的查询看起来像:

Select * from myTable where item in @item

所以我会从我的应用程序中传递值,例如“113113”、“112112”、“114114”(以任意顺序)。我想按该列表对结果进行排序。

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

【问题讨论】:

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


    【解决方案1】:

    您如何参数化IN 子句?

    当您在 SQL Server 2008 上时,我将传入带有两列 itemsort_orderTable Valued Parameter,然后加入其中。然后你可以在末尾添加一个ORDER BY sort_order

    【讨论】:

    • +1,或者如果通过 csv,拆分为带有标识列的 @table 变量,您可以加入该标识列然后按顺序排序
    • @KM 所以OP需要为一个简单的选择写一个存储过程
    • @LuisSiquot - 他们已经在使用存储过程。但即使没有,他们也应该使用参数化查询。有很多拆分表值函数按照 KM 的建议运行,OP 可以加入,但如果不需要 2005 兼容性,TVP 会更好。
    • 选择按 SQL IN() 子句中值的顺序排序检查 this solution 。希望对某人有所帮助。
    【解决方案2】:

    与您连接 ('113113','112112','114114') 的方式相同,可以连接到 where 子句中的 sql 语句

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

    通过clausule传递给您的订单

    【讨论】:

    • 不可能他不知道会有多少个值 - 您的案例陈述可能是从 1 到 n,其中 n 真的非常高。
    • @JonH 也许他知道会有多少价值。当然,此解决方案适用于有限且“逻辑”的 n 种情况。 OP 可以评估一点 n 是否符合他的需要。确保如果这是针对演示问题,n 涵盖所有逻辑案例。
    • 我同意你的观点,但他提到他不知道有多少。因此我的评论。
    • @JonH 但值“来自文本框数据”
    • 这个答案是否对特定问题足够敏感似乎值得商榷,但我发现它对类似问题很有用。弃用(和辩论)似乎有点过分。
    【解决方案3】:

    来自上面 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 或编号。您当然可以修改它以便寻找空间 而不是 @987654326 @ 值。否则,马丁的回答是正确的。请注意,在我的示例中,我使用的是我的一张表,因此您需要将名称 Login 更改为您正在处理的任何名称。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2011-01-31
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多