如果参数值为 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
我是 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