在SQL中要比較同一個Table不同欄位的大小值,需要使用 CASE WHEN 去判斷出同一筆資料中各欄位的大小值。
在SQL 2008後,可以使用Values 衍生資料表的方式哦!
最近看到「Finding Max Value From Multiple Values」覺得蠻有趣的,就記錄下來分享給大家。
在SQL中要比較不同欄位的大小,需要使用 CASE WHEN 去判斷出同一筆資料中各欄位的大小值,如下圖,
開始之前我們先看一下,如下是3個數值(1, 2, 3)取最大值的話,會如何做呢?
1.CASE WHEN
SELECT (CASE WHEN 3 > (CASE WHEN 1 > 2 THEN 1 ELSE 2 END)
THEN 3
ELSE (CASE WHEN 1 > 2 THEN 1 ELSE 2 END)
END ) AS maxOfNums;
比較的值逾多,運算式逾複雜
2.UNION
SELECT MAX(num) AS maxOfNums
FROM (SELECT 1 AS num
UNION
SELECT 2
UNION
SELECT 3) AS tblNums;
3.VALUES (SQL 2008 (含)以上限定) 衍生資料表
SELECT MAX(num) AS maxOfNums
FROM (VALUES (1), (2), (3)) AS tblNums(num);
VALUES用法如下,
(VALUES (欄位1值), (欄位1值) ..) AS Table別名(欄位別名)
如果多個欄位用逗號隔開,如下,
(VALUES (欄位1值, 欄位2值), (欄位1值, 欄位2值) ..) AS Table別名(欄位1別名, 欄位2別名)
詳細可參考「資料表值建構函式 VALUES」。
再回到原本的問題,Table的欄位比較呢?
一樣先建立測試Table來試看看唄!
CREATE TABLE tblNums
( id INT PRIMARY KEY ,
c1 INT,
c2 INT) ;
GO
INSERT INTO tblNums (id, c1, c2) VALUES (1, 1, 2);
INSERT INTO tblNums (id, c1, c2) VALUES (2, 3, 4);
INSERT INTO tblNums (id, c1, c2) VALUES (3, 6, 5);
SELECT * FROM dbo.tblNums;
1.CASE WHEN
SELECT id, c1, c2
, CASE WHEN c1 > c2 THEN c1 ELSE c2 END AS maxOfc1c2
FROM dbo.tblNums;
2.VALUES (SQL 2008 (含)以上限定) 衍生資料表
SELECT id, c1, c2
,( SELECT MAX(c)
FROM ( VALUES ( c1), ( c2) ) AS cValues ( c )
) AS maxOfc1c2
FROM dbo.tblNums;
看起來比較SQL簡潔一些,如果是SQL 2008(含)以上的話。
有這種問題不妨可以試試使用 VALUES 方式哦!
參考資料
Finding Max Value From Multiple Values
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^