在过滤数据时使用*作为通配符
本文关键字:通配符 过滤 数据 | 更新日期: 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));