Я пытаюсь написать оператор выбора, который всегда будет включать указанную запись c (42 в приведенном ниже примере) независимо от того, как упорядочены данные. Использование 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 вышеуказанных варианта. Все, что я пробовал, стало довольно сложным, и я стараюсь сделать его как можно более простым.