制作一个仅在值不是 empty/null 时运行的 WHERE 函数

Making a WHERE function that only runs if value is not empty/null

所以我目前正在使用 C# 和 SQL 在 vi​​sual studio 2013 上做一些事情,我想制作一个表格,其中将有几个文本框用于输入每个 field/column 的搜索条件帮助更快地在数据库中查找记录。

用户可以根据需要向 fields/boxes 输入值。但是,我不确定如何为它编写 WHERE 语句。 我知道如果我执行 WHERE FirstName = '' 它什么也不会显示,这意味着我必须附加 WHERE。

我认为拥有类似

的东西不是一个好主意
public void QueryName(string FN, string LN,etc,etc)
"SELECT * FROM Table WHERE "
IF(FirstName != "") THEN
+ "FirstName = 'FN'" + IF(LastName != "") THEN
+ "LastName = 'LN'"

因为它会中断(我假设)如果它有一个 WHERE 后跟什么都没有,并且我无法将每个追加部分作为 "WHERE" 开始,因为用户决定它搜索的值。

所以我正在寻找的是一种使用用户选择的多个值在 C# 中创建 SQL 语句的方法,而不会比需要的更长和更复杂。

如果我让任何人感到困惑,我会尽力解释。

你可以这样做:

SELECT * FROM Table WHERE (FirstName = '' OR FirstName = @FirstName) AND (LastName = '' OR LastName = @LastName

这种方法可能会导致一些性能问题。

我更喜欢使用 C# 构建 sql 查询来识别用户想要应用的过滤器,例如:

var sql = "SELECT * FROM Table WHERE 1 = 1 /* Just to not care about if the where clause is needed */";

if (!String.IsNullOrWhiteSpace(FirstName))
{
    sql += " AND FirstName = @FirstName ";
}

if (!String.IsNullOrWhiteSpace(LastName))
{
    sql += " AND LastName= @LastName";
}

您可以使用这样的查询:

select * from YourTable a
where (isnull(@FirstName, '') = '' or a.FirtName = @FirstName) and 
      (isnull(@LastName, '') = '' or a.LastName = @LastName);

此代码 isnull(@FirstName, '') <> '' 将检查提供的值是否为 null,然后将其设为空,否则保持不变。然后检查它是否为空。因此,如果此条件通过,则它永远不会尝试与 FirstName 列进行比较。