パラメーターをさまざまなデータ型に使用できるように、複数の SQL Server クエリを 1 つのクエリに凝縮しようとしています。これらのタイプは、日付、数値、または文字列です。パラメータは @SearchValue と呼ばれます。
厳密に型指定された DataSet には、以下に示す 3 つのクエリがあります。
これは VB.Net コード ビハインド ファイルを使用した ASP.Net 用ですが、この質問は ASP.Net 以外にも適していると思います。
ユーザーが検索 TextBox に日付を入力した場合は、これを呼び出します。
クエリ:
SELECT ID, PaymentAmount, PaymentDate, WhatWasPaymentFor
FROM Payments
WHERE (ParentID = @ParentID) AND
(PaymentDate = @SearchValue)
日付検索クエリの VB.Net コード ビハインドからの呼び出し:
tblObject = theTableAdapter.GetDataByPaymentDate(dcmParentsId, TextBoxSearch.Text)
If tblObject.Count() > 0 Then
GridViewSummary.DataSource = tblObject
GridViewSummary.DataBind()
End If
他のものは数字専用で、最後のものはその他すべてのものです。
これは数字専用です:
SELECT PaymentDate, PaymentAmount, WhatWasPaymentFor, ID
FROM Payments
WHERE (ParentID = @ParentID) AND
(PaymentAmount = @SearchValue)
これは、他の 2 つのクエリでデータが見つからない場合に呼び出されます。
SELECT PaymentDate, PaymentAmount, WhatWasPaymentFor, ID
FROM Payments
WHERE (ParentID = @ParentID) AND
((WhatWasPaymentFor LIKE '%' + @SearchValue + '%') OR
(@SearchValue = 'ALL'))
このコーディングはすべてそのまま機能します。日付以外の値で .GetDataByPaymentDate を呼び出そうとするとエラーが発生するため、この方法で行いました。
単一のクエリを使用して、日付、数字、および文字列による検索を処理する方法はありますか?
*更新*
すべてのサンプル クエリに感謝します。どのような結果が得られるかを確認するために、SQL Server Management Studio ですべてのサンプル クエリを試しています。
これはゴードンのクエリに基づいていますが、データは返されません。
DECLARE @SearchValue VARCHAR = '01/01/2012'
DECLARE @SearchType VARCHAR = 'Dates'
DECLARE @ParentID INT = 3
SELECT ID, PaymentAmount, PaymentDate, WhatWasPaymentFor
FROM Payments cross join
(select @SearchValue as sv) const
WHERE ParentID = @ParentID AND
(case when @SearchType = 'Dates' and ISDATE(const.sv) = 1
then (case when PaymentDate = CAST(const.sv AS datetime) then 'true' else 'false' end)
when @SearchType = 'Numbers' and ISNUMERIC(const.sv) = 1
then (case when PaymentAmount = cast(const.sv as Int) then 'true' else 'false' end)
when @SearchType = 'Everything Else'
then (case when WhatWasPaymentFor LIKE '%' + const.sv + '%' OR const.sv='ALL' then 'true' else 'false' end)
end) = 'true'
これは gh9 のものに基づいており、データを引き出します。ありがとうgh9:
DECLARE @SearchValue VARCHAR = 'Books'
DECLARE @ParentID INT = 3
DECLARE @PaymentDate DATETIME = NULL
DECLARE @PaymentAmount MONEY = NULL
SELECT ID, PaymentAmount, PaymentDate, WhatWasPaymentFor
FROM Payments
WHERE ParentID = @ParentID
AND (@paymentDate is null OR PaymentDate = @Paymentdate)
AND (@paymentAmount is null OR paymentAmount = @paymentAmount)
AND ((@SearchValue is null OR
(WhatWasPaymentFor LIKE '%' + @SearchValue + '%' OR @SearchValue='ALL'))
)