我想为以下组合图编写最佳组合登录SQL存储过程或ASP.net。
图中的每个字段有4种组合。所以,总计将是20种组合。我,不想在SQL server或c#中编写20 if else语句。
用户可以选择Quotation no或20等组合。我不想写20 if else语句。
是他们在SQL或C#中编写语句以使其更好的更好方法。
例如,用户可以选择报价编号或代理商名称或开始日期或结束日期或两个或多个字段的组合。
编写算法的最佳方法是什么?这是组合
1-仅按报价编号搜索
2-仅按代理商搜索
3-仅按开始日期搜索
4-仅按结束日期搜索
5-仅按合同编号搜索
6 - 报价否+代理商编号
7 - 报价编号+开始日期
8 - 报价否+结束日期
9 - 按所有字段选择
在尝试使用许多过滤器执行搜索时,我偶然发现了类似的问题。我发现的最佳解决方案是使用动态SQL查询,其中语句是基于参数构建的。
sql语句的select子句是静态的,但from子句和where子句基于参数。
CREATE PROCEDURE dbo.SearchQuotation
(
@QuotationNo INT,
@AgencyName VARCHAR(50),
@StartDate DATETIME,
@EndDate DATETIME,
@Term INT
)
AS
BEGIN
DECLARE @SQL NVARCHAR(4000)
SELECT @SQL = N'SELECT * FROM Quotations WHERE 1 = 1'
DECLARE @ParametersDefinition NVARCHAR(4000)
SELECT @ParametersDefinition = N'@QuotationNoParameter INT,
@AgencyNameParameter VARCHAR(50),
@StartDateParameter DATETIME,
@EndDateParameter DATETIME,
@TermParameter INT'
IF @QuotationNo IS NOT NULL
SELECT @SQL = @SQL + N' AND QuotationNo = @QuotationNoParameter '
IF @AgencyName IS NOT NULL
SELECT @SQL = @SQL + N' AND AgencyName = @AgencyNameParameter '
IF @StartDate IS NOT NULL
SELECT @SQL = @SQL + N' AND StartDate = @StartDateParameter '
IF @EndDate IS NOT NULL
SELECT @SQL = @SQL + N' AND EndDate = @EndDateParameter '
IF @Term IS NOT NULL
SELECT @SQL = @SQL + N' AND Term = @TermParameter '
EXECUTE sp_executesql
@SQL,
@ParametersDefinition,
@QuotationNoParameter = @QuotationNo,
@AgencyNameParameter = @AgencyName,
@StartDateParameter = @StartDate,
@EndDateParameter = @EndDate,
@TermParameter = @Term
END
从SQL方面你可以通过这种方式实现:
SELECT * FROM Qoutes AS q
WHERE (q.QoutationNo = @QoutationNo OR @QoutationNo IS NULL)
AND (q.AgencyName = @AgencyName OR @AgencyName IS NULL)
AND (q.StartDate = @StartDate OR @StartDate IS NULL)
AND (q.EndDate = @EndDate OR @EndDate IS NULL)
AND (q.Term = @Term OR @Term IS NULL)
如果未从网页中选择,则传递NULL值。