1
列表計算最高值(日期)

假設我有,我有這樣的查詢來源:T-SQL用戶定義的函數或類似於由值

Select Fields 
from TableA A 
join TableB B on A.SomeField = B.SomeField 
join TableC C on B.SomeField = C.SomeField 
Join TableD D on C.SomeField = D.SomeField 
Where 
    CustomMaxDateFunction (A.SomeDateField, B.SomeDateField, C.SomeDateField, D.SomeDateField) > '20130101 23:59:00' 

我知道我可以寫在那裏從句作類似下面的,但我寧願不要:

Where 
    A.SomeDateField > '20130101 23:59:00' 
    OR B.SomeDateField > '20130101 23:59:00' 
    OR C.SomeDateField > '20130101 23:59:00' 
    OR D.SomeDateField > '20130101 23:59:00' 

請記住,列數來比較基於源表的連接中的數量將是可變的。

因爲我們不得不重複使用自定義函數(或存儲過程),所以對於最簡單的方法來做這件事的任何建議。

+0

我知道它的一個示例查詢 - 但「在A.SomeField = B.SomeField」上連接TableD D是不正確的。 – Andrew

+0

糟糕,你是對的。對不起,我正在複製和粘貼。我會解決這個問題。 – DavidStein

回答

4

而不是創建一個新的函數,你可以使用內建的MAX聚合。

SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v) 

或在您的查詢的情況下:

SELECT * 
FROM TableA AS A 
JOIN TableB AS B 
ON ... 
JOIN TableC AS C 
ON ... 
JOIN TableD AS D 
ON ... 
WHERE (SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v)) > '20130101 23:59:00' 

如果這還不夠乾淨,你可以把它包裝成一個函數

CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME) 
RETURNS TABLE 
AS 
    RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v); 

然後調用它像這樣:

SELECT * 
FROM TableA AS A 
JOIN TableB AS B 
ON ... 
JOIN TableC AS C 
ON ... 
JOIN TableD AS D 
ON ... 
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, C.SomeDateField, D.SomeDateField) AS mdf 
WHERE mdf.MaxDate > '20130101 23:59:00' 

遠離其他在此查詢上下文函數形式他們會傷害性能: http://sqlity.net/en/498/t-sql-tuesday-24-prox-n-funx/

所有功能的共同點但是,你固定的參數給定數量,所以第一個選項可能是你最好的選擇。

編輯: 如果你很喜歡一個函數的想法,你可以這樣做:

CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME) 
    RETURNS TABLE 
    AS 
     RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v) WHERE v IS NOT NULL; 

現在你可以這樣調用:

SELECT * 
FROM TableA AS A 
JOIN TableB AS B 
ON ... 
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, NULL, NULL) AS mdf 
WHERE mdf.MaxDate > '20130101 23:59:00' 

實際上需要墊未使用帶NULL的參數。函數中額外的WHERE子句可防止有關消除NULL值的警告,否則您將獲得該值。正如RBarryYoung在評論中提到的那樣,SQL Server中的函數沒有真正的可選參數功能。

+0

我可以用許多參數做些什麼,但讓它們可選嗎? – DavidStein

+0

@DavidStein可選參數在T-SQL中不起作用。你可以定義它們,但是當你調用該函數或者把woord'default'放在它的位置時,你必須用參數填充每個參數。完全沒用。 – RBarryYoung

+0

順便說一下。支持找到兩種不同的方法來做到這一點,以避免在這個例子中標量函數會帶來可怕的性能。 – RBarryYoung

相關問題