【问题标题】:select from table where column = any value从表中选择,其中列 = 任何值
【发布时间】:2013-12-08 12:56:34
【问题描述】:

我正在尝试创建一个查询,该查询将按 3 列过滤列表:

age = "2";
gender = "male";
race = "pitbull";

MySqlCommand tempCommand = _DbHandler.CreateCommand("SELECT * FROM dogs WHERE age = @age AND gender = @gender AND race = @race");
tempCommand.Parameters.AddWithValue("@age", age);
tempCommand.Parameters.AddWithValue("@gender", gender);
tempCommand.Parameters.AddWithValue("@race", race);

MySqlDataReader tempReader = tempCommand.ExecuteReader();

并且我希望能够让我们说性别列来获取任何值,如果这有效: 性别 = "*";

如何在一个查询中实现这一目标?

年龄、性别和种族在真实代码中的参数中。

【问题讨论】:

  • "*" 也是string。如果您的gender 将是"*",则您的查询按您说的那样工作。我觉得我不完全理解你的问题..
  • 对于 gender = "*" 我的意思是“性别列中的任何值”。

标签: c# mysql ado.net


【解决方案1】:

要捕获任何值,您只需不将该参数添加到查询中,也不要将条件添加到 sql。

这样的事情应该可以工作:

String sql = "SELECT * FROM dogs";

if ( age != "*" || gender != "*" || race != "*" )
  sql += " WHERE 1=1";

if ( age != "*" ) sql += " AND age = @age";
if ( gender != "*" ) sql += " AND gender = @gender";
if ( race != "*" ) sql += " AND race = @race";

MySqlCommand tempCommand = _DbHandler.CreateCommand(sql);

if ( age != "*" ) tempCommand.Parameters.AddWithValue("@age", age);
if ( gender != "*" ) tempCommand.Parameters.AddWithValue("@gender", gender);
if ( race != "*" ) tempCommand.Parameters.AddWithValue("@race", race);

【讨论】:

  • 你说得对,我没有阅读完整的sql。我会在我的答案中做一些改变
  • 还有age,genderracestrings,而不是char
  • 是的,我的错:我对 C# 有点生疏了,而且这个问题可能与语言无关,所以我输入错误的字符/字符串比较
【解决方案2】:

我能想出的最快方法是这样,您只需要更改 sql 语句。现在我只希望dogs 没有一百万行......

MySqlCommand tempCommand = _DbHandler.CreateCommand(
          @"SELECT * 
            FROM dogs 
            WHERE (@age='*' OR age = @age)
            AND  (@GENDER='*' OR gender= @gender)
            AND (@race='* OR race = @race");

我假设你在任一参数中都提供了一个 * 来表示“没有给出值”所以设置

age="*";

如果您不想根据年龄选择狗。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2020-10-13
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多