在MySQL中使用OR语句

本文关键字:OR 语句 MySQL | 更新日期: 2023-09-27 18:10:30

我正在尝试在我的c#应用程序中构建MySQL查询,我想知道是否可以在MySQL参数中使用OR语句。

我有一个名字列表,我想检查一下哪些名字已经存在于数据库中。下面是一个简短的例子

List<string> names = new List<string> {"adam", "bob", "cathy"}; //actual list is much longer
MySqlConnection connection = getAndOpenConnection();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Employees WHERE name = @names";
command.Parameters.Add(new MySqlParameters("@names", String.Format("names = {0}", String.Join(names, " or name = ")))); //is this line legal?

我最初的想法是这样构造命令文本:

command.CommandText = String.Format("SELECT * FROM Employees WHERE name = '{0}'", String.Join(names, "' or name = '"))

代码将给出我想要的正确命令文本,但我真的想要防止SQL注入。

有人能帮助我如何正确地构建MySqlCommand吗?

在MySQL中使用OR语句

不容易。您需要创建一个IN查询,这对于参数化来说是一个痛苦的过程(您确实应该这样做)。基本上,您有两个选项:

  • 根据数组大小构建适当的命令和参数
  • 使用一个工具将为您做

后者更容易;对于"dapper",这只是:

connection.Query("SELECT * FROM Employees WHERE name in @names", new { names })
          .ToList();

(这将是一个List<dynamic>;如果您有一个与列匹配的Employee类,您可以使用connection.Query<Employee>(...).ToList()来获得List<Employee>)。

而前者更像是(对于一个简单的版本):
var sb = new StringBuilder("SELECT * FROM Employees WHERE name=@name0");
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1; i < names.Count ; i++) {
    sb.Append(" or name=@name").Append(i);
    cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.ToString();

也有一些其他的方法:

switch(names.Count)
{
    case 0: cmd.CommandText = "SELECT * FROM Employees"; break;
    case 1:
        cmd.CommandText = "SELECT * FROM Employees WHERE name=@name";
        cmd.Parameters.AddWithValue("name", names[0]);
        break;
    default:
        var sb = new StringBuilder(
            "SELECT * FROM Employees WHERE name IN (@name0")
        cmd.Parameters.AddWithValue("name0", names[0]);
        for(int i = 1;i<names.Count;i++) {
            sb.Append(",@name").Append(i);
            cmd.Parameters.AddWithValue("name" + i, names[i]);
        }
        cmd.CommandText = sb.Append(")").ToString();
        break;
}