Sql server SQL Server中的条件排序

Sql server SQL Server中的条件排序,sql-server,Sql Server,表T: ID | Name | Days ID是主键 我确实希望从T中选择*,按ID降序,但在顶部是那些ID在1000和1004之间的条目 select * from T order by Id descending // something like a *case*? 1004-1st/1003 2nd/1002 3rd/1001 4th/1000 5nd。。。然后第六个应该是最大Id,在这之后,除了1000-1004之间的Id,所有的Id都下降了,我们已经在顶部显示了 我也想知道lin

T

ID | Name | Days
ID
是主键

我确实希望
从T中选择*,按ID降序
,但在顶部是那些ID在
1000
1004
之间的条目

select *
from T
order by Id descending // something like a *case*?
1004-1st/1003 2nd/1002 3rd/1001 4th/1000 5nd。。。然后第六个应该是最大Id,在这之后,除了1000-1004之间的Id,所有的Id都下降了,我们已经在顶部显示了

我也想知道linq声明。

试试这个

select *
from T
order by case when ID between 1000 and 1004 then -100000 else id end,ID desc
这里的
-100000
是s的随机低值

例如:

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 
从客户的答案中提取样本数据

这是怎么回事

  • 它检查您的ID是否符合您的条件,并为其分配一个 值为1
  • 其他的都有2个
  • 它将首先按此值排序
  • 具有匹配条件的ID始终位于第一位
  • 然后,我们按照描述顺序按ID对剩菜进行排序
  • 输出:

    ╔══════╗
    ║  ID  ║
    ╠══════╣
    ║ 1004 ║
    ║ 1003 ║
    ║ 1002 ║
    ║ 1001 ║
    ║ 1000 ║
    ║  999 ║
    ║  998 ║
    ╚══════╝
    
    我做了另外一个示例,它在我们的数据库中生成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      ║
    ╚════════╝
    

    如果我的表有20k个条目怎么办?您给出了一个特定的固定示例,其中包含7个条目。正如我所看到的,没有区别。如果您的ID符合以下条件:
    当T.ID介于1000和1004之间时,则1
    ,则在该查询中它们将始终位于第一位。您是对的,我的错,对不起。谢谢你的帮助informations@FlorinM. 我用更好的例子更新了我的答案。
    ;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      ║
    ╚════════╝