在过滤数据时使用*作为通配符

本文关键字:通配符 过滤 数据 | 更新日期: 2023-09-27 17:49:29

我希望在c#访问数据库中执行对多列的搜索。数据以行为单位构建,每列保存相关数据或"*"作为通配符。

作为一个粗略的例子:

如果我有数据是(,表示新的单元格)Ford, Fiesta, *, 1998如果我有一个值…

福特,嘉年华,汽油,1998

查找并显示数据行

当前我正在尝试:

string sql = "SELECT * FROM [mydatabase]  
WHERE Manufacturer ='" + textBox1.Text +  
"' OR Manufacturer='*' AND Model ='" + textBox2.Text +  
"' OR Model='*' AND Fuel ='" + textBox3.Text +  
"' OR Fuel='*' AND Year='" + textBox4.Text + "' OR Year='*'";

但这是显示所有值,而不是过滤它们。是否有在查询中使用和if/else而不是OR的方法?

在过滤数据时使用*作为通配符

如果您想使用通配符,我会将其从where子句中排除。

或者,如果您想将所有列作为一个字符串搜索,您可以将它们全部添加到选择列表中的新列中。

例如:

        public void GetCars(string manufacturer, string model, string fuel, DateTime? year, string searchString)
        {
            string query = @"
                           SELECT *,
                           ISNULL([Manufacturer],'') + ' ' + ISNULL([Model],'') + ' ' ISNULL([Fuel],'') + ' ' ISNULL('Year', '') AS [SearchString]
                           FROM [MyDatabase]
                           WHERE [Manufacturer]=@Manufacturer ";
            if (!String.IsNullOrEmpty(model))
                query += @"AND [Model]=@Model ";
            if (!String.IsNullOrEmpty(fuel))
                query += "AND [Fuel]=@Fuel ";
            if (year.HasValue)
                query += "AND [Year]=@Year ";
            if (!String.IsNullOrEmpty(searchString))
                query += @"AND [SearchString] Like '%@SearchString%' ";
            using (SqlCommand sqlCommand = new SqlCommand(query))
            {
                sqlCommand.Parameters.AddWithValue("@Manufacturer", manufacturer);
                if (!String.IsNullOrEmpty(model))
                    sqlCommand.Parameters.AddWithValue("@Model", model);
                if (!String.IsNullOrEmpty(fuel))
                    sqlCommand.Parameters.AddWithValue("@Fuel", fuel);
                if (year.HasValue)
                    sqlCommand.Parameters.AddWithValue("@Year", year.Value);
                if (!String.IsNullOrEmpty(searchString))
                    sqlCommand.Parameters.AddWithValue("@SearchString", searchString);
                //Execute to data table etc
            }
        }

您可以使用coalesce代替Manufacturer ='" + textBox1.Text + "' OR Manufacturer='*',这有点像if/else:

string sql = "... Manufacturer = coalesce('" + textBox1.Text + "', '*') ...";

这样,您只需要and s,而不需要与or混合。这可能是现在的问题,因为or s导致and不被计算。

您还可以在and周围添加圆括号,这样or将仅应用于圆括号内:

 string sql = "... where (Manufacturer ='" + textBox1.Text + "' OR Manufacturer='*') and ...";

注意你应该使用参数化查询,所以你会得到这样的东西:

command.CommandText = "select * from ... where Manufacturer = coalesce(@mgr, '*') and ...";
command.Parameters.Add(new SqlParameter("mgr", textBox1.Text));