首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

SQL Server 動態排序:利用 CASE 運算式實現 ORDER BY 靈活切換

     編輯:更多程式設計知識

基本 ORDER BY

SELECT CompanyName, ContactName, ContactTitle
FROM Customers
ORDER BY CompanyName;  -- 固定依公司名排序

CASE 運算式語法

CASE [input_expression]
    WHEN when_expression THEN result_expression
    [...n]
    [ELSE else_result_expression]
END

簡單應用:將稱謂轉為中文

SELECT FirstName, TitleOfCourtesy,
       CourtesyInTC = CASE TitleOfCourtesy
           WHEN 'Ms.' THEN '小姐'
           WHEN 'Dr.' THEN '博士'
           WHEN 'Mr.' THEN '先生'
           WHEN 'Mrs.' THEN '太太'
           ELSE '先生/小姐'
       END
FROM Employees;

動態排序核心技巧

在 `ORDER BY` 後搭配 `CASE`,依變數決定排序欄位:

DECLARE @OrderKey TINYINT = 2;  -- 1=CompanyName, 2=ContactName, 其他=ContactTitle

SELECT CompanyName, ContactName, ContactTitle
FROM Customers
ORDER BY CASE
    WHEN @OrderKey = 1 THEN CompanyName
    WHEN @OrderKey = 2 THEN ContactName
    ELSE ContactTitle
END;

封裝為預存程序

CREATE PROCEDURE sp_SelectCustomersDynamicOrder
    @OrderKey TINYINT = NULL
AS
BEGIN
    SELECT CompanyName, ContactName, ContactTitle
    FROM Customers
    ORDER BY CASE
        WHEN @OrderKey = 1 THEN CompanyName
        WHEN @OrderKey = 2 THEN ContactName
        ELSE ContactTitle
    END;
END;

呼叫方式

EXEC sp_SelectCustomersDynamicOrder;      -- 預設 ContactTitle
EXEC sp_SelectCustomersDynamicOrder 1;    -- 依 CompanyName
EXEC sp_SelectCustomersDynamicOrder 2;    -- 依 ContactName

進階:多欄位動態排序

ORDER BY CASE
    WHEN @SortBy = 'NameAsc'  THEN ContactName
    WHEN @SortBy = 'NameDesc' THEN ContactName
    ELSE CompanyName
END
ASC,  -- 或搭配第二層 CASE 控制 ASC/DESC
CASE
    WHEN @SortBy = 'NameDesc' THEN ContactName
END DESC;

效能提醒

  • 動態 `ORDER BY` 可能導致查詢計畫無法有效重用,參數嗅探問題較嚴重。
  • 若排序欄位有索引,動態 CASE 可能使索引失效 (無法 Seek)。
  • 對於高頻、大資料量查詢,考慮**動態 SQL** (`sp_executesql`) 產生確定的 ORDER BY,配合 `OPTION (RECOMPILE)` 或參數化計畫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved