MSSQL ORDER BY传递列表

时间:2013-11-21 11:42:27

标签: sql sql-server

我正在使用Lucene对SQL数据子集执行查询,该数据返回一个RecordID的得分列表,例如: 11,4,5,25,30。

我想使用此列表从RecordIDs的完整SQL表中检索一组结果。

所以SELECT * FROM MyFullRecord where RecordID in (11,5,3,25,30)

我希望检索到的列表能够维持评分顺序。

我可以通过像这样使用Order来实现;

ORDER BY (CASE WHEN RecordID = 11 THEN 0 WHEN RecordID = 5 THEN 1 WHEN RecordID = 3 THEN 2 WHEN RecordID = 25 THEN 3 WHEN RecordID = 30 THEN 4 END)

我担心加载服务器加载,特别是如果我传递长的RecordID列表。有没有人有这方面的经验或如何确定最佳列表长度。

在MSSQL中是否还有其他方法可以实现此功能?

罗杰

3 个答案:

答案 0 :(得分:2)

您可以将列表记录到具有排序优先级的表或表变量中。 然后加入你的表与这个排序。

DECLARE TABLE @tSortOrder (RecordID INT, SortOrder INT)
INSERT INTO @tSortOrder (RecordID, SortOrder)
SELECT 11, 1 UNION ALL
SELECT 5, 2 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 25, 4 UNION ALL
SELECT 30, 5

SELECT *
FROM yourTable T
LEFT JOIN @tSortOrder S ON T.RecordID = S.RecordID
ORDER BY S.SortOrder

答案 1 :(得分:1)

您可以创建一个内存表来加入,而不是按语句创建搜索顺序。它在眼睛上更容易,并且可以更好地扩展。

SQL声明

SELECT  mfr.*
FROM    MyFullRecord mfr
        INNER JOIN (
          SELECT * 
          FROM (VALUES (1, 11),
                       (2, 5),
                       (3, 3),
                       (4, 25),
                       (5, 30)
               ) q(ID, RecordID)
        ) q ON q.RecordID = mfr.RecordID
ORDER BY
        q.ID

here寻找小提琴

答案 2 :(得分:0)

类似的东西:

SELECT * FROM MyFullRecord where RecordID in (11,5,3,25,30)

ORDER BY 
    CHARINDEX(','+CAST(RecordID AS varchar)+',',
              ','+'11,5,3,25,30'+',')  

SQLFiddle demo