【问题标题】:Selecting from a column that can equal anything从可以等于任何内容的列中进行选择
【发布时间】:2014-04-28 00:38:19
【问题描述】:

这是我当前的代码

SELECT * FROM [Products] WHERE CategoryID=@category

我正在使用 ASP.net 和 c#,我从 page1 设置会话,然后重定向到 page2,然后将此会话用作类别。问题是我希望当会话为空时(即,如果您直接转到页面,而不是从 page1 上的重定向),代码可以像下面那样工作

SELECT * FROM [Products] WHERE CategoryID= anything

所以我的所有产品都会出现,而不仅仅是特定类别的产品。 无论如何我可以做到这一点吗?

谢谢。

【问题讨论】:

  • 这是 MySQL 吗?可能不是;方括号中的表名在 MySQL 中不起作用。你能适当地编辑你的标签吗?
  • 参考这个answer

标签: c# mysql asp.net sql


【解决方案1】:

如果设置了@category,则运行您的查询。如果没有,运行这个:

从产品中选择 *

【讨论】:

    【解决方案2】:

    您将需要一个不同的查询,一个完全省略CategoryID= whatever 的查询来执行您想要执行的操作。这很容易编程。

    【讨论】:

      【解决方案3】:

      不,没有可以传递的值将 = 转换为 <>。为此,您必须使用不同的查询,可以是一段不同的代码,也可以是根据要求内置的查询。

      为了简单起见,我个人会使用 LINQ:

      var qry = context.products.AsQueryable();
      if (!string.IsNullOrEmpty(session))
          qry = qry.Where(p => p.CategoryID == session);
      

      您可以继续添加这样的术语,然后在最后执行查询以获取结果。

      您可以通过将查询创建为字符串和参数集合来获得类似的灵活性:

      var qstr = "SELECT * FROM Products";
      var parms = new Dictionary<string, object>();
      
      if (!string.IsNullOrEmpty(session))
      {
          qstr += " WHERE CategoryID = @category";
          parms["category"] = session;
      }
      
      using (var cmd = connection.CreateCommand())
      {
          cmd.CommandType  = CommandType.Text;
          cmd.CommandText = qstr;
      
          foreach (var parm in parms)
              cmd.Parameters.AddWithValue("@" + parm.Key, parm.Value);
      
          using (var reader = cmd.ExecuteReader())
          {
              //....
          }   
      }
      

      如果您需要多个表单,则可以添加一些逻辑来构建条件列表。请注意如何将它们缝合在一起。

      仍然更喜欢较短的 LINQ 解决方案:P

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 2015-07-22
        • 2021-11-12
        • 1970-01-01
        相关资源
        最近更新 更多