[SQL]取得Table中不同欄位的最大值

在SQL中要比較同一個Table不同欄位的大小值,需要使用 CASE WHEN 去判斷出同一筆資料中各欄位的大小值。
在SQL 2008後,可以使用Values 衍生資料表的方式哦!

最近看到「Finding Max Value From Multiple Values」覺得蠻有趣的,就記錄下來分享給大家。

在SQL中要比較不同欄位的大小,需要使用 CASE WHEN 去判斷出同一筆資料中各欄位的大小值,如下圖,

image

 

開始之前我們先看一下,如下是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);

image

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;

image

 

看起來比較SQL簡潔一些,如果是SQL 2008(含)以上的話。

有這種問題不妨可以試試使用 VALUES 方式哦!

 

參考資料

Finding Max Value From Multiple Values

資料表值建構函式 VALUES

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^