需求:在單一資料列中,找出多個數值欄位(如 A、B、C、D、E)的最大值,並忽略 NULL。傳統寫法需大量 CASE WHEN 或 IIF 巢狀,難以維護。本文介紹一種巧妙的 UNION ALL 子查詢寫法,將橫向欄位轉為縱向資料列,再套用 MAX() 聚合函數,程式碼簡潔且易擴充。
CREATE TABLE T (
A DECIMAL(10,1), B DECIMAL(10,1), C DECIMAL(10,1),
D DECIMAL(10,1), E DECIMAL(10,1)
);
INSERT INTO T VALUES
(-21.5, -15.0, -5.0, NULL, NULL),
(-5.5, -11.5, NULL, NULL, NULL),
(-1.0, -16.5, -10.5, NULL, NULL);
SELECT *,
Max_Value = (
SELECT MAX(Val) FROM (
SELECT A AS Val UNION ALL
SELECT B UNION ALL
SELECT C UNION ALL
SELECT D UNION ALL
SELECT E
) AS Tmp
)
FROM T;
| A | B | C | D | E | Max_Value |
|---|---|---|---|---|---|
| -21.5 | -15.0 | -5.0 | NULL | NULL | -5.0 |
| -5.5 | -11.5 | NULL | NULL | NULL | -5.5 |
| -1.0 | -16.5 | -10.5 | NULL | NULL | -1.0 |
UNION ALL 將 5 個欄位逐列堆疊成單一欄位 Val 的虛擬資料表。MAX(Val) 自動忽略 NULL,取得最大值。SELECT *,
(SELECT MAX(Val) FROM (VALUES (A),(B),(C),(D),(E)) AS V(Val)) AS Max_Value
FROM T;
語法更簡潔,效能相當。
SELECT *, GREATEST(A, B, C, D, E) AS Max_Value FROM T;
原生函數,最佳效能與可讀性。
若欄位數不固定,可搭配動態 SQL 組裝 UNION ALL 或 VALUES 子句。
UNION ALL / VALUES 成本極低。