【问题标题】:Best way to write Combination logic in SQL or MVC for multiple select options在 SQL 或 MVC 中为多个选择选项编写组合逻辑的最佳方法
【发布时间】:2018-06-02 21:45:55
【问题描述】:

我想为下面的组合图写SQL存储过程或ASP.net的最佳组合登录。

图表中的每个字段都有 4 种组合。因此,总共将是 20 种组合。我,不想在 SQL server 或 c# 中写 20 if else 语句。

这是逻辑的 UI。

用户可以选择引用编号或20等的组合。我不想写20 if else语句。

他们有没有更好的方法来用 SQL 或 C# 编写语句以使其更好。

例如 用户可以从报价单编号或机构名称或开始日期或结束日期或两个或多个字段的组合中进行选择。

编写算法的最佳方法是什么? 这是组合

1- 仅按报价单号搜索

2- 仅按代理编号搜索

3- 仅按开始日期搜索

4- 仅按结束日期搜索

5- 仅按合同编号搜索

6 - 报价单号 + 代理商号

7 - 报价单号 + 开始日期

8 - 报价单号 + 结束日期

9 - 按所有字段选择

【问题讨论】:

  • 您只需动态构建查询。 IQueryable<T> data = db.T; if (agencyName.HasValue) { data = data.Where(x => x.AgencyName == agencyName.Value)
  • 你的意思不是 20 种组合,而是 4^5 所以 1024 种组合。

标签: c# sql sql-server asp.net-mvc stored-procedures


【解决方案1】:

前段时间我在尝试使用许多过滤器执行搜索时偶然发现了一个类似的问题。我找到的最佳解决方案是使用动态 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”附近的语法不正确。无法运行您的查询
  • 我刚刚在我的数据库上尝试过,它可以工作,请刷新页面并重试。在我的情况下它可以正常工作,所以我猜你的数据库有问题。
【解决方案2】:

从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 值。

【讨论】:

  • 大多数情况下都有效...它适用于 Only Quotation number、Quotation number 和 AgencyName 之类的组合,但它不适用于 or 子句如“quotation number or AgencyName”
  • 可以分享几个组合样本吗?
  • 添加了一些组合请检查
  • 1 到 5 应该适用于 6 到 9,报价编号 + 代理...当两者​​都匹配时,只有它返回记录
  • @San Jaisy,您检查过所有案例了吗?是否满足上述查询?
猜你喜欢
  • 2020-05-27
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多