SQL Server中的条件排序

时间:2015-11-05 08:11:52

标签: sql-server

T

ID | Name | Days

ID是PK。

我确实希望select * from T, order by ID descending,但在TOP上是ID1000之间1004的条目

select *
from T
order by Id descending // something like a *case*?

1004 - 1st / 1003 2nd / 1002 3rd / 1001 4th / 1000 5nd ...然后6th应该是最大Id,并且在此之后所有下降除了我们已经在TOP上显示的1000到1004之间的Ids。

我也想知道linq声明。

3 个答案:

答案 0 :(得分:0)

试试这个

select *
from T
order by case when ID between 1000 and 1004 then -100000 else id end,ID desc

此处-100000是随机低值

示例:

SELECT *
FROM   (VALUES (998),
               (999),
               (1000),
               (1001),
               (1002),
               (1003),
               (1004) ) tc (id)
ORDER  BY CASE
            WHEN ID BETWEEN 1000 AND 1004 THEN -100000
            ELSE id
          END,
          ID DESC 

答案 1 :(得分:0)

SELECT *
FROM (VALUES (998), (999), (1000), (1001), (1002), (1003), (1004)) AS T(ID)
ORDER BY CASE
        WHEN T.ID BETWEEN 1000 AND 1004 THEN 1
        ELSE 2
    END
    , ID DESC;

Sick的回答中获取样本数据。

这是如何运作的?

  1. 检查您的ID是否符合您的条件并为其指定 值1
  2. 其他一切都有2
  3. 首先按此值排序
  4. 具有匹配条件的ID始终是第一个
  5. 然后我们按DESC顺序按ID排序剩余物
  6. <强>输出:

    ╔══════╗
    ║  ID  ║
    ╠══════╣
    ║ 1004 ║
    ║ 1003 ║
    ║ 1002 ║
    ║ 1001 ║
    ║ 1000 ║
    ║  999 ║
    ║  998 ║
    ╚══════╝
    

    我做了另外一个例子,它在我们的DB中生成676.800行:

    ;WITH TestTable (ID)
    AS (
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM sys.objects
        CROSS JOIN sys.schemas
        )
    SELECT *
    FROM TestTable AS T
    ORDER BY CASE
            WHEN T.ID BETWEEN 1000 AND 1004 THEN 1
            ELSE 2
        END
        , ID DESC;
    

    结果如下:

    ╔════════╗
    ║  ID    ║
    ╠════════╣
    ║ 1004   ║
    ║ 1003   ║
    ║ 1002   ║
    ║ 1001   ║
    ║ 1000   ║
    ║ 676800 ║
    ║ 676799 ║
    ║ 676798 ║
    ║ 676797 ║
    ║ 676796 ║
    ║ 676795 ║
    ║ ...    ║
    ║ 1006   ║
    ║ 1005   ║
    ║ 999    ║
    ║ 998    ║
    ║ ...    ║
    ║ 1      ║
    ╚════════╝
    

答案 2 :(得分:-1)

SELECT column_name, column_name
FROM table_name
ORDER BY column_name ASC|DESC, column_name ASC|DESC;