如何確定SQL Server欄中的最大值
CREATE TABLE [dbo].[MinMax](
[MinMaxID] [int] IDENTITY(1,1) NOT NULL,
[Value1] [int] NULL,
[Value2] [int] NULL,
[Value3] [int] NULL,
[Value4] [int] NULL,
CONSTRAINT [PK_MinMax]PRIMARY KEY CLUSTERED
(
[MinMaxID] ASC
)WITH (PAD_INDEX= OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
注意,表定義允許在它的四個列中使用NULL值。在大多數情況下,我會盡量應用非NULL列,但在這種情況下,一個或幾個日期列中很有可能包含NULL值;我當然不希望僅僅為了逃避非NULL問題而輸入錯誤的數據。於是我把所有日期列定義為NULL列。圖1給出了一些你可以插入表中的樣本值。
對於簡單Min()和Max()函數的作用,SQL有它自己的規定,即比較一個列中的值。既然沒有內置函數來比較任何兩個值並確定最大或最小值,你應該自行編寫這種函數。我決定把它們叫做Min2()和Max2()。見列表A。
你可以用這個代碼對它們進行測試:
SELECT dbo.Min2( 23, 34 )
SELECT dbo.Max2( 23,NULL)
SELECT dbo.Min2( NULL, 34 )
SELECT dbo.Max2( 23,NULL)
要比較原始表中的值,你可以簡單地嵌入函數調用,就像這樣:
SELECT dbo.Max2( Value1, dbo.Max2( Value2, dbo.Max2( Value3, Value4 ) ) )
FROM dbo.MinMax
根據原始表,這個調用的結果如下:
7
10
27
81
還是有一個問題:上面的代碼把NULL轉換成0。在Min2()函數中,這意味著如果有自變量為NULL值,則返回結果為0。在多數情況下,我認為這樣做是恰當的,但在一些特殊情況下,你可能希望返回NULL而不是0。
你可能已經編寫了一個剛好只接受四個參數的函數,但這樣的函數過於特殊,不能在其它情況下使用。花一點時間考慮更普遍的情況,你將會得到更加有用的函數。