【问题标题】:SQL Server: How to write conditional WHERE clause containing different queries per condition?SQL Server:如何编写包含每个条件不同查询的条件 WHERE 子句?
【发布时间】:2022-01-17 20:21:47
【问题描述】:

我在 StackOverflow 上找到了一堆关于条件 WHERE 子句的答案,但我无法找到一个特定于我的问题的答案,所以只是寻求一点帮助...

我公司的网站包含直接在 C# 代码中编写的所有 SQL 查询(我不喜欢这样,但这是另一回事)& 我在尝试更新包含 WHERE 中的多个条件的查询时遇到问题子句基于用户在表单上勾选了哪些复选框。

表单中有一组复选框(目前有 3 个选项,但此列表可能会增加)。对于选择的每个“提供程序类型”,需要在 WHERE 子句中添加一个附加条件,但我不确定如何最好地处理这个问题。

这是处理此问题的代码。 ProviderTypesCSV 最多可以包含 3 个值 (0,1,2),具体取决于用户检查的选项数量:

if (!String.IsNullOrEmpty(searchOptions.ProviderTypesCSV))
{
    // values are in a csv string.  Split out the csv
    var statuses = searchOptions.ProviderTypesCSV.Split(',');

    if (statuses.Contains("0"))   //Hospitals & Facilities
    {
        strSQL += " AND (<<perform query for 'Hospitals & Facilities'>>)";
    }

    if (statuses.Contains("1"))  //Physicians and Practitioners
    {
        strSQL += " AND (<<perform query for 'Physcians and Practitioners'>>)";
    }

    if (statuses.Contains("2"))   //In-Person Visit Providers
    {
        strSQL += " AND (<<perform query for 'In-Person Visit Providers'>>)";
    }
}

当前问题显然,是上面的查询在选择多个选项时不考虑。选择多个选项时,条件运算符需要“或”或“,而不是”和“,但我不确定如何最好地将其设置为UP,而不会制作混乱并考虑到稍后添加的添加'选项。

只是好奇设置它的最佳方式。

【问题讨论】:

  • 处理这个问题的真正最佳方法是停止在您的编程代码中编写 sql。它草率,容易出错,并带来许多不必要的挑战。您在这里面临的挑战之一是您需要为每个谓词附加 OR,但您甚至不知道可能已经存在哪些其他谓词。像这样纯粹从代码中做的任何事情都是等待失败的杂物。
  • @SeanLange - 我 100% 同意你的观点!几个月前我加入了这家公司并提出了这个问题(我相信所有加入的新开发人员都有)。响应始终是保持代码不变。我们正处于完全重写本网站的早期阶段,但遗憾的是,这个现有的网站需要同时维护:(

标签: c# sql-server


【解决方案1】:

您可以定义一个字符串列表并添加您的条件,然后使用" OR " 分隔符连接每个元素并将其用于您的AND

if (!String.IsNullOrEmpty(searchOptions.ProviderTypesCSV))
    {
        //values are in a csv string.  Split out the csv
        var statuses = searchOptions.ProviderTypesCSV.Split(',');
        
        List<string> conditions = new List<string>();

        if (statuses.Contains("0"))   //Hospitals & Facilities
        {
            conditions.Add("(<<perform query for 'Hospitals & Facilities'>>)");
        }
        if (statuses.Contains("1"))  //Physicians and Practitioners
        {
            sconditions.Add("(<<perform query for 'Physcians and Practitioners'>>)");
        }
        if (statuses.Contains("2"))   //In-Person Visit Providers
        {
            conditions.Add("(<<perform query for 'In-Person Visit Providers'>>)");
        }
        
        strSQL += " AND (" + String.Join(" OR ", list) + ") ";
        
    }

【讨论】:

  • 非常感谢!效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2021-04-25
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多