2015-11-05 2 views
1

Таблица T:Условное упорядочение в SQL Server

ID | Name | Days 

ID является PK.

Я хочу select * from T, order by ID descending, но на вершине, чтобы быть те записи, которые имеют ID между 1000 и 1004

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

1004 - первый/второй 1003/1002 третьего/1001 четвёртую/1000 5ND ... а затем 6-й должен быть максимальным Id, а после этого все нисходит, за исключением идентификаторов между 1000 - 1004, которые мы уже отображали в TOP.

Я хотел бы также знать инструкцию linq.

ответ

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. Он проверяет, является ли ваш идентификатор ваших критериев и присвоить ему значения 1
  2. Всего остального будет иметь 2
  3. Это будет сортировать по этому значению первого
  4. Ваших идентификаторов с соответствующими критериями будут ВСЕГДА приходят первые
  5. Затем мы сортируем остатки по идентификатору в порядке DESC

O utput:

╔══════╗ 
║ 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  ║ 
╚════════╝ 
+0

Что делать, если моя таблица содержит 20 тыс. Записей? Вы указали конкретный фиксированный пример, содержащий 7 записей. –

+0

Нет никакой разницы, как я вижу. Если ваши идентификаторы соответствуют этим критериям: 'КОГДА T.ID МЕЖДУ 1000 И 1004 ТОГДА 1', они всегда будут первыми в этом запросе. –

+0

Вы правы, моя вина, извините. спасибо за информацию –

0

Попробуйте

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 
-1
SELECT column_name, column_name 
FROM table_name 
ORDER BY column_name ASC|DESC, column_name ASC|DESC; 
+1

Это не решит проблему OPS –

Смежные вопросы