你有乙個裡面包含整數、浮點數、金額或日期的n列sql server表,而你的任務是返回這些列中某一行的最大值。你甚至被要求一次求幾行的最大值,返回乙個記錄組(record set)。
第乙個任務暗示你可能預先不知道要比較哪一列或比較多少列,但事實並非總是如此。可能你恰恰知道你要比較哪些列,並且知道不可能增加任何新列。另一方面,你可能必須做好預防計畫,預計到可能會增加一些新列。寫乙個剛好比較n個值的函式可以完成這個任務,但它在其它情況下又有多大用處呢?
假設下面是你的表:
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給出了一些你可以插入表中的樣本值。
minmaxid
value1
value2
value3
value4
對於簡單min()和max()函式的作用,sql有它自己的規定,即比較乙個列中的值。既然沒有內建函式來比較任何兩個值並確定最大或最小值,你應該自行編寫這種函式。我決定把它們叫做min2()和max2()。
create function dbo.min2
(@value1 int= 0,
@value2 int= 0
)returns int
asbegin
declare @result int
set @value1 = isnull(@value1,0)
set @value2 = isnull(@value2,0)
if @value1 <= @value2
set @result = @value1
else
set @result = @value2
return @result
endgo
create function dbo.max2
(@value1 int= 0,
@value2 int= 0
)returns int
asbegin
declare @result int
set @value1 =isnull(@value1,0)
set @value2 =isnull(@value2,0)
if @value1 >= @value2
set @result = @value1
else
set @result = @value2
return @result
endgo你可以用這個**對它們進行測試:
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
根據原始表,這個呼叫的結果如下:
還是有乙個問題:上面的**把null轉換成0。在min2()函式中,這意味著如果有自變數為null值,則返回結果為0。在多數情況下,我認為這樣做是恰當的,但在一些特殊情況下,你可能希望返回null而不是0。
你可能已經編寫了乙個剛好只接受四個引數的函式,但這樣的函式過於特殊,不能在其它情況下使用。花一點時間考慮更普遍的情況,你將會得到更加有用的函式。
確定幾個SQL Server欄中的最大值
你有乙個裡面包含整數 浮點數 金額或日期的n列sql server表,而你的任務是返回這些列中某一行的最大值。你甚至被要求一次求幾行的最大值,返回乙個記錄組 record set 第乙個任務暗示你可能預先不知道要比較哪一列或比較多少列,但事實並非總是如此。可能你恰恰知道你要比較哪些列,並且知道不可能...
SQLServer中的幾個重要時間函式
函式 引數 功能 getdate 返回系統目前的日期與時間 datediff interval,date1,date2 以interval 指定的方式,返回date2 與date1兩個日期之間的差值 date2 date1 dateadd interval,number,date 以interval...
sqlserver中,sql程式設計的幾個小常
sqlserver中,sql程式設計的幾個小常 1 取出剛剛插入 刪除 的資料select 欄位名 from inserted deleted 2 對於update實際上是先delete然後再insert所以如果想得到update前後的資料值,應該先從deleted取出,然後從inserted取出 ...