SQL复杂数据搜索查询

时间:2012-11-24 14:15:49

标签: c# sql sql-server-2008

我正在使用c#.NET。

我有3个字段(文本框)txtName,txtSirname,txtLocation。

我的数据库表是

Name      | Sirname  | Location

Steve     | Jobs     | US
Kevin     | Peterson | UK
Haechelle | Gibbs    | South Africa

我有一个搜索按钮。在点击搜索按钮时,我想根据文本框显示所有结果。

BUT

如果所有文本框都为空,我想显示整个表格。 如果name为空,那么它应该根据sirname和place显示结果。 如果sirname为空,则应根据名称和位置显示结果。 如果name和sirname为空......以及所有可能的组合。

我的问题是我不允许在C#中使用if语句。我只能在一个SQL查询中编写它。我该怎么办请指导我。

3 个答案:

答案 0 :(得分:3)

使用

WHERE     
    ([Name] = @name OR @name IS NULL) OR
    ([Sirname] = @sirname OR @sirname IS NULL) OR
    ([Location] = @location OR @location IS NULL)

如果您的文本框为空,则将NULL作为查询/ sproc中参数的值传递。

答案 1 :(得分:3)

  

耶。他告诉我,我应该避免10个ifs并为性能原因写一个查询

他完全错了。如果您通过TSQL中的拼凑查询来处理每个组合,那么该查询将执行非常次优化(并且特别容易受到参数嗅探的性能影响)。

坦率地说,我会忽略他,并在C#代码中写出正确的查询 - 这将是几乎是瞬时的(如:微秒) - 要求数据库服务器运行错误的TSQL查询非常昂贵。例如,这是原始TSQL中累积过滤器的完整实现:​​

static void AppendClause(StringBuilder clause, string tsql)
{
    clause.Append(clause.Length == 0 ? " where " : " and ")
          .Append('(').Append(tsql).Append(')');
}    
static Foo[] SearchFoo(string name, int? age, string region)
{
    var whereClause = new StringBuilder();
    if (name != null) AppendClause(whereClause, "f.Name=@name");
    if (age != null) AppendClause(whereClause, "f.Age=@age");
    if (region != null) AppendClause(whereClause, "f.Region=@region");

    string tsql = "select f.* from Foo f" + whereClause;
    using (var conn = GetConnection())
    { // note I'm using "dapper" here for brevity, but any ADO.NET-based
      // code would suffice
        return conn.Query<Foo>(tsql, new { name, age, region }).ToArray();
    }
}

或在LINQ中相同:

static Foo[] SearchFoo(string name, int? age, string region)
{
    using (var ctx = GetContext())
    {
        IQueryable<Foo> query = ctx.Foos;
        if(name != null) query = query.Where(f => f.Name == name);
        if(age != null) query = query.Where(f => f.Age == age);
        if(region != null) query = query.Where(f => f.Region == region);
        return ctx.ToArray();
    }
}

你的同事非常错误。如果他仍然不同意,请随意指出他的方向; p

答案 2 :(得分:1)

select ... from ... where
    name = isnull(nullif(@name, ''), name) and
    sirname = isnull(nullif(@sirname, ''), sirname) and
    location = isnull(nullif(@location, ''), location)

只要您想省略参数,只需传递null或空字符串""即可。它假设:@name@sirname@location是参数。