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 視為 0 參與比較。若業務需求「有 NULL 則結果為 NULL」,可修改為:
IF @a IS NULL OR @b IS NULL RETURN NULL
固定四參數函數擴充性差。建進階版本可考慮:
TABLE-VALUED PARAMETER 傳入動態欄位集合UNPIVOT 將橫向欄位轉縱向,再用標準 MAX()SELECT MaxMaxID, MAX(Val) AS MaxValue
FROM dbo.MinMax
UNPIVOT (Val FOR Col IN (Value1, Value2, Value3, Value4)) AS u
GROUP BY MaxMaxID
此法原生支援 NULL 忽略,語法更標準、維護性更高。