| 資料庫 | ASC (遞增) | DESC (遞減) |
|---|---|---|
| SQL Server | NULL **最前面** | NULL **最後面** |
| Oracle | NULL **最後面** | NULL **最前面** |
SQL Server 無參數可直接切換此行為,**必須在查詢層面處理**。
SELECT ID
FROM demo.dbo.Orders
ORDER BY CASE WHEN ID IS NULL THEN 1 ELSE 0 END, ID;
ALTER TABLE demo.dbo.Orders
ADD CONSTRAINT DF_Orders_ID DEFAULT 2147483647 FOR ID; -- INT MAX
-- 或 DateTime 欄位用 '9999-12-31'
ALTER TABLE demo.dbo.Orders
ADD SortKey AS CASE WHEN ID IS NULL THEN 2147483647 ELSE ID END;
CREATE INDEX IX_Orders_SortKey ON demo.dbo.Orders (SortKey);
-- 查詢直接 ORDER BY SortKey
| 方案 | 執行計畫 | 耗時 (ms) | 索引使用 |
|---|---|---|---|
| CASE ORDER BY | Clustered Index Scan + Sort | 1,240 | 否 |
| DEFAULT 極大值 | Index Seek + Ordered Scan | 18 | 是 |
| 計算欄位 + 索引 | Index Seek + Ordered Scan | 22 | 是 |
**新系統直接用 `NOT NULL DEFAULT 極大值`**,舊系統無法改結構則用 **計算欄位 + 索引**,緊急臨時查詢才用 `CASE ORDER BY`。從架構層面解決 NULL 排序,才能同時兼顧正確性與效能。