2015-11-05 85 views
1

T條件排序

ID | Name | Days 

ID是PK。

我確實想select * from T, order by ID descending,但TOP是那些有ID1004之間1000

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

1004項 - 5ND 2日/ 3日1002/1001 4/1000 1/1003 ...然後第6個應該是最大ID,在此之後,除了我們已經在TOP上顯示的1000-1004之間的Ids之外,所有這些都是遞減的。

我想知道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. 它會檢查你的ID是否符合您的條件,併爲它分配其他1
  2. 一切的 值將有2
  3. 將這個值第一
  4. 你的ID相匹配的標準排序將永遠是第一位
  5. 然後我們通過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  ║ 
╚════════╝ 
+0

如果我的表有20K條目會怎麼樣?您給出了一個包含7個條目的特定固定示例。 –

+0

我可以看到沒有區別。如果你的ID符合這個標準:'當1000和1004之間的時間爲T.'時,它們總是在這個查詢中排在第一位。 –

+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

這不會解決問題有機磷 –