2

次のようにクエリする必要があるソースがあるとします。

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 句を次のように記述できることはわかっていますが、そうはしません。

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'

比較する列の数は、結合内のソース テーブルの数に基づいて変動することに注意してください。

カスタム関数 (またはストアド プロシージャ) を繰り返し使用する必要があるため、これを行う最も簡単な方法についての提案。

4

1 に答える 1

5

新しい関数を作成する代わりに、組み込みの 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 の関数には実際のオプション パラメーター機能はありません。

于 2013-01-03T19:48:35.343 に答える