当前位置: 首页 > 面试题库 >

多个可选的WHERE参数

卢雅惠
2023-03-14
问题内容

我想为一组SQL查询创建一个过滤器,以便用户最多可以通过三个值过滤SQL
SELECT。用户界面具有三个文本框,每个文本框都将绑定到SQL表中的列名。用户可以通过这些文本框提供一个,两个或三个条件。

到目前为止,这就是我所拥有的。我知道这些if(textbox...声明将不起作用,但是我找不到解决该问题的方法。(使用"SELECT TOP 10 primaryFile FROM dbo.basket WHERE (basket.itemGuid = @itemguid) AND (basket.batchid = @batchid) AND (basket.account = @account"不会返回任何结果。

private List<string> GetSnippets()
{
    List<string> snippets = new List<string>();

    string connectionString = @"SNIP";
    //string sql = @"SELECT TOP 10 primaryFile FROM dbo.basket WHERE";
    string sql = @"SELECT TOP 10 primaryFile FROM dbo.basket WHERE (basket.itemGuid = @itemguid) AND (basket.batchid = @batchid) AND (basket.account = @account)";
    //if (textBoxGUID.Text.Length > 0) sql += " basket.itemGuid = @itemguid";
    //if (textBoxBatchID.Text.Length > 0) sql += " basket.batchid = @batchid";
    //if (textBoxAccount.Text.Length > 0) sql += " basket.account = @account";

    using (SqlConnection connection = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        command.Parameters.AddWithValue("@itemguid", textBoxGUID.Text);
        command.Parameters.AddWithValue("@batchid", textBoxBatchID.Text);
        command.Parameters.AddWithValue("@account", textBoxAccount.Text);

        try
        {
            connection.Open();
            if (connection.State == ConnectionState.Open)
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        snippets.Add((string)reader["primaryFile"]);
                        Console.WriteLine(reader["primaryFile"]);
                    }
                }
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
    return snippets;
}

问题答案:

如果我正确遵循,您想根据所有填充变量过滤结果,以处理未填充变量,则需要OR在变量为空(NULL)时添加for :

WHERE (basket.itemGuid = @itemguid OR @itemguid IS NULL)
  AND (basket.batchid = @batchid OR @batchid IS NULL) 
  AND (basket.account = @account OR @account IS NULL)


 类似资料:
  • 问题内容: 我有一个表单,用户可以指定各种参数来挖掘某些数据(状态,日期等)。 我可以产生一个查询: 等等。每一个都是可选的(我可以选择带有的所有行,或者带有的所有行,或者带有etc的所有行)。 给定大量参数(全部为可选参数),组成动态存储过程的最佳方法是什么? 我正在处理各种数据库,例如:MySQL,Oracle和SQLServer。 问题答案: 实现此目的的最简单方法之一: 等等。这完全消除了

  • 问题内容: 我正在尝试在我的文档归档系统上为高级搜索页面编写查询。我正在尝试通过多个可选参数进行搜索。我有大约5个参数,它们可以是空字符串或搜索字符串。我知道我不必检查每个字符串或为空并为每个组合创建一个单独的存储过程。 编辑:最终使用: 问题答案: 您可以这样使用COALESCE(或ISNULL):

  • 是否有一种方法可以使用来完成这一任务,而不需要为每个Patamenter组合创建大量/语句?

  • 因此,为了提供搜索功能,我可以进行多个连接。我开始使用带有@query表示法的JPQL,但我必须对每个参数进行检查,结果一团糟。我开始研究其他选项,我看到了关于QueryDSL、标准和规范的东西,但我不确定我应该关注和学习哪一个。不幸的是,我不知道很多关于这个主题,我希望有人能指出我在正确的方向,以一个很好的实现这个搜索。谢谢!

  • 问题内容: 我正在编写一些更新表的代码。根据用户想要执行的操作,它会更新大量的记录,也可能更新较小的记录。描绘因素是组ID。 用户可以选择是更新所有记录的表,还是仅更新具有该groupID的记录。我想对两个实例都使用相同的存储过程,也许在其中有一点逻辑来区分场景。(我不想使用90%相同的代码编写两个存储的proc。) 我不是存储过程的专家,也不知道是否可以传入可选参数,或者如何根据groupID是

  • 问题内容: 只是想知道是否有一种更优雅或更标准的方式来处理可选参数,或者是否必须检查每个参数是否为空。我有10多个可选参数,因此变得有点难看。 理想情况下,我想是这样的bash命令:。 问题答案: 编写这样的实用程序