確定幾個SQL Server欄中的最大值

2022-09-14 13:33:07 字數 2207 閱讀 3975

你有乙個裡面包含整數、浮點數、金額或日期的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取出 ...