首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 跨欄位取得最大值:自訂函數 Max2 實作

     編輯:MySQL 資料庫相關知識

SQL 內建 MAX() 僅支援單欄位縱向比較,若需比較同一列的多個欄位(橫向比較),需自訂函數。本文實作 Max2() 與 Min2(),支援 NULL 處理與多欄位巢狀比較。

測試資料表

CREATE TABLE dbo.MinMax (
    MinMaxID INT IDENTITY(1,1) PRIMARY KEY,
    Value1 INT NULL, Value2 INT NULL,
    Value3 INT NULL, Value4 INT NULL
)

允許 NULL,避免為規避 NULL 而寫入假資料。

自訂兩值比較函數

CREATE FUNCTION dbo.Max2(@a INT, @b INT)
RETURNS INT
AS
BEGIN
    IF @a IS NULL RETURN ISNULL(@b, 0)
    IF @b IS NULL RETURN ISNULL(@a, 0)
    RETURN CASE WHEN @a > @b THEN @a ELSE @b END
END
GO

CREATE FUNCTION dbo.Min2(@a INT, @b INT)
RETURNS INT
AS
BEGIN
    IF @a IS NULL RETURN ISNULL(@b, 0)
    IF @b IS NULL RETURN ISNULL(@a, 0)
    RETURN CASE WHEN @a < @b THEN @a ELSE @b END
END
GO

測試驗證

SELECT dbo.Max2(23, 34)    -- 34
SELECT dbo.Max2(23, NULL)  -- 23
SELECT dbo.Min2(NULL, 34)  -- 34
SELECT dbo.Min2(23, NULL)  -- 23

套用至資料表:四欄位巢狀比較

SELECT dbo.Max2(
           Value1,
           dbo.Max2(Value2, dbo.Max2(Value3, Value4))
       ) AS MaxValue
FROM dbo.MinMax

結果範例:7, 10, 27, 81

NULL 處理策略討論

上述實作將 NULL 視為 0 參與比較。若業務需求「有 NULL 則結果為 NULL」,可修改為:

IF @a IS NULL OR @b IS NULL RETURN NULL

通用化建議

固定四參數函數擴充性差。建進階版本可考慮:

  • 使用 TABLE-VALUED PARAMETER 傳入動態欄位集合
  • 或改用 UNPIVOT 將橫向欄位轉縱向,再用標準 MAX()

UNPIVOT 替代方案(SQL Server 2005+)

SELECT MaxMaxID, MAX(Val) AS MaxValue
FROM dbo.MinMax
UNPIVOT (Val FOR Col IN (Value1, Value2, Value3, Value4)) AS u
GROUP BY MaxMaxID

此法原生支援 NULL 忽略,語法更標準、維護性更高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved