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 ║
╠══════╣
║ 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 ║
╚════════╝