首页 > 解决方案 > 如何确保记录始终在返回列表中并正确排序

问题描述

我正在尝试编写一个始终包含特定记录(在下面的示例中为 42)的 select 语句,而不管数据的排序方式如何。使用ORDER BY IIF( ID = 42, 0, 1 )将允许记录始终显示在返回的数据集中,但它始终位于顶部而不是正确排序。

ID  ID  vs  ID  ID
------      ------
42  42      0   40
0   40      1   41
1   41      2   42
2   43      3   43
3   44      4   44
4   45      5   45
5   46      6   46
6   47      7   47
7   48      8   48
8   49      42  49

这是我创建的一个示例,用于说明各种现实世界的使用示例:

SET NOCOUNT ON;

DECLARE @Table TABLE ( ID int );
DECLARE @ID int = 0;

WHILE ( @ID < 100 )
BEGIN
    INSERT INTO @Table ( ID )
    VALUES ( @ID );

    SET @ID += 1;
END

SELECT TOP(10) ID 
FROM @Table
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 30
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 40
ORDER BY IIF( ID = 42, 0, 1 ), ID;

SELECT TOP(10) ID 
FROM @Table
WHERE ID > 50
OR ID = 42
ORDER BY IIF( ID = 42, 0, 1 ), ID;

我需要定义SELECT语句以至少满足上述 4 种变化。我尝试过的所有事情都开始变得相当复杂,我正在努力让它尽可能简单。

标签: tsqlsql-server-2016

解决方案


为什么不简单地使用union

SELECT *
FROM
(
    SELECT TOP(10) ID 
    FROM @Table
    ORDER BY ID

    UNION 

    SELECT ID
    FROM @Table
    WHERE ID = 42
) As x
ORDER BY ID
;

推荐阅读