假设我正在查询表,并且null可能是要查找的值之一。一个像这样设置的查询
command.CommandText = "select * from People where Saluation = @salutation";
if(salutation != null) command.Parameters.AddWithValue("@salutation", salutation);
else command.Parameters.AddWithValue("@salutation", DBNull.Value);
在称呼为空时,不会返回任何结果。所以我倾向于这样做,但对我来说感觉很丑:
string whereClause;
if(!string.IsNullOrEmpty(salutation))
{
whereClause = "Salutation = @salutation";
command.Parameters.AddWithValue("@salutation", salutation);
}
else whereClause = "Salutation is null";
command.CommandText = "select * from People where " + whereClause;
有更正确的方法吗?
答案 0 :(得分:3)
我可能会避免连接来构建你的where子句。您可以将sql更改为以下内容。可以为SQL注入攻击打开自己。
command.CommandText = "select * from People where (@salutation is null and salutation is null) or Saluation = @salutation";
答案 1 :(得分:1)
您可以添加一个额外的参数来指定是否要返回空值,并稍微修改您的查询。
使用您的示例:
command.CommandText = "select * from People where ((@IsNull_Salutation = 1 AND Salutation IS NULL) OR (Saluation = @Salutation))";
command.Parameters.AddWithValue("Salutation", salutation ?? (object)DBNull.Value);
command.Parameters.AddWithValue("IsNull_Salutation", (salutation == null) ? 1 : 0);
这使您可以完全参数化查询。如果您决定要停止返回空值,则只需将传入的值更改为IsNull_Salutation参数。
从内存中,这类似于SqlCommandBuilder类在其自动生成的插入/更新/删除查询中处理空值的方式。
答案 2 :(得分:0)
也许您可以使用COALESCE功能,将默认值设置为第二个参数。
答案 3 :(得分:0)
保持简单: 只需使用这样的WHERE子句
WHERE @field IS NULL OR field = @field
Sql Server足够聪明,可以根据@field参数的值使用正确的条件。 在这种情况下重要的是 - 在SELECT stmt中使用之前不要更改查询中的参数值。
答案 4 :(得分:-1)
command.CommandText = "select * from People where Saluation ";
command.CommandText += salutation != null ? ("= " + salutation) : "is NULL";