如果参数值为 NULL 使用 ADO.NET,我可以创建条件查询以跳过 AND 条件吗?

Can I create conditional query to skip an AND condition if the parameter value is NULL using ADO.NET?

我是 C#.NET 的新手(我来自 Java EE 环境)并且我有以下是关于如何使用 ADO.NET 创建允许参数条件的 SQL 查询的疑问。

所以基本上在我的项目中,我有一个 class,其中我将查询声明为静态字符串变量,如下所示:

public static class PROT_UTENTI
{

    public static string SELECT_USERS_FROM_AOO =
        @"SELECT *
            FROM PROT_UTENTI
            WHERE [SiglaAOO] = @SiglaAOO
            AND [Notifica] = @Notifica";

    ...............................................................
    ...............................................................
    ...............................................................
}

正如您在前面的代码中看到的那样,我有一个由 SELECT_USERS_FROM_AOO 表示的查询,它带有 2 个参数 @SiglaAOO@Notifica

我的疑问是:@Notifica可以是null。如果此参数值为 null 我想跳过此 AND 条件。

ADO.NET 允许以某种方式做到这一点?

场景 1:

您的 table 列有时会为空,您希望能够找到那些。您的查询需要是:

SELECT * FROM table WHERE column = @parameter OR (column IS NULL and @parameter IS NULL)

在参数中传递一个值以查找 column 是该精确值的行。在参数中传递 NULL 以查找 column 为空的行。

场景 2:

您的 table 列有时会为空或不为空,您希望能够 return 它们。您需要一种传递参数的方式,以便有时跳过参数(根本不用于搜索)。您的查询需要是:

SELECT * FROM table WHERE (column = @parameter OR @parameter IS NULL)

传值求值。传递 NULL 以跳过此检查(查找具有任何值 column 的行,包括空值)

场景 3:

您的 table 列有时会为空或不为空,您希望能够 return 它们。您需要一种传递参数的方式,以便有时跳过参数(根本不用于搜索),而其他时候列值可以是与模式匹配的一些可变事物(包括任何事物),但不是空值。这是半跳过 - 您可以搜索任何非空值。您的查询需要是:

SELECT * FROM table WHERE column LIKE @parameter OR (@parameter IS NULL AND column is null)

传值求值。传递“%”以查找任何非空值。传递更精确的通配符以找到匹配项。传递 NULL 以仅查找列中具有空值的行。

场景 4:

您的 table 列有时会为空,并且您希望能够找到这些以及该列为空的任何情况。您将传递 'skip' 作为参数值以跳过检查。 table 列永远不会包含 'skip'。您的查询需要是:

SELECT * FROM table 
WHERE 
  column = @parameter OR column IS NULL or @parameter = 'skip'

传递一个值以查找具有该值或空值的列。通过'skip'跳过检查

如果 none 满足您的需要,请结合使用这些技术。要在列中搜索空值,您必须使用 column is null AND @parameter = 'some value I will pass to indicate I want nulls' 模式

记得

没有任何东西等于 NULL,即使是另一个 null...

SELECT * FROM table WHERE NULL=NULL --returns 0 rows. 

必须使用 IS NULL.

检查是否为空

x = NULL 任何形式,包括 x = @parameter_that_is_set_to_null 始终为 false

是的你可以这样做,通过使用这个简单的技巧:

// 1. First Your have to put Notification into a variable.
var notification = Null; // For Example Notification Parameter has null value

// 2. You Have to Write a Queries based on your requirements.
string queryWhenNotificationIsNull = "SELECT ...."; // This Query doesn't include AND Condition.

string queryWhenNotificationIsNotNull = "SELECT ... "; // This Query include AND Condition.

// 3. You have to check that the Notification Parameter is Null or Not ?
if(string.IsNullOrEmpty(Notification))
   // call QueryWhenNotificationIsNull ....
else
   // call QueryWhenNotificationIsNotNull ....

正如其他人指出的那样,这是构建 SQL 语句的一种奇怪方式。但是,您可以通过将 SELECT_USERS_FROM_AOO 变成一种方法来做到这一点。然后在要使用 SELECT_USERS_FROM_AOO 的代码中使用实际值调用该方法,以便它可以 return 所需的字符串。

string SELECT_USERS_FROM_AOO(string notifica)
{
    return string.IsNullOrEmpty(notifica) ?
       "SELECT * FROM PROT_UTENTI WHERE [SiglaAOO] = @SiglaAOO" :
       "SELECT * FROM PROT_UTENTI WHERE [SiglaAOO] = @SiglaAOO AND [Notifica] = @Notifica";
}

示例结果:

Console.WriteLine(SELECT_USERS_FROM_AOO(string.Empty));
// SELECT * FROM PROT_UTENTI WHERE [SiglaAOO] = @SiglaAOO

Console.WriteLine(SELECT_USERS_FROM_AOO("asdf"));
// SELECT * FROM PROT_UTENTI WHERE [SiglaAOO] = @SiglaAOO AND [Notifica] = @Notifica