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

时间:2015-05-18 10:04:31

标签: c# sql

我希望在C#中的访问数据库中搜索多个列。 数据按行构建,每列保存相关数据或" *"作为通配符。

粗略的例子:

如果我有数据(表示新单元格) 福特,嘉年华,*,1998 如果我有价值......

Ford,Fiesta,Petrol,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?

2 个答案:

答案 0 :(得分:1)

您可以使用Manufacturer ='" + textBox1.Text + "' OR Manufacturer='*',而不是coalesce,而不是if/else

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

这样,您只需要and个,而不是or。这可能现在给出了问题,因为or导致and无法被评估。

您还可以在and周围添加括号,因此or仅应用于括号内:

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

注意你应该使用parameterized queries ,所以你会得到这样的结果:

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

答案 1 :(得分:1)

如果您想使用外卡,我会将其从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
            }
        }