通常情况下,当您创建一个 SQL 存储过程或任何接受参数的查询时,您可能会强制用户为该参数提供一个值。在实际应用中并非总是如此,因此您需要允许 NULL 值和空字符串。让我们通过示例看看如何编写 SQL 查询,以便在参数为空或为 NULL 时选择所有数据。
在此 SQL 演示中,我们将使用以下数据来演示“参数为空或 NULL 时选择所有数据”。

通常,您可能会像下面这样编写查询
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Clerical'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = @Occupation

如果您未提供有效的职业值,它将返回一个空表。
提示:在实际应用中,我们使用 存储过程 来执行此类操作。但是,为了使查询更简单,我们选择了一个常规的 SQL Server 查询。
SQL 查询:当参数为空或 NULL 时选择所有数据的示例
以下示例列表将向您展示获取结果的各种方法。
SQL 查询:当参数为 NULL 时选择所有数据的示例
在此示例中,我们使用 IIF 函数 和 IS NULL 来检查参数值是否为 NULL。如果为真,则 Occupation = Occupation,否则 Occupation = 用户提供的结果。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Management'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = IIF(@Occupation IS NULL, Occupation, @Occupation)

我将参数值更改为 NULL。

如果您尝试输入空字符串,上述查询将返回一个空表。

SQL 查询:当参数为 NULL 时选择所有数据的示例 2
在此示例中,我们使用 CASE 语句 和 IS NULL 来检查参数值是否为 NULL。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Clerical'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = CASE WHEN @Occupation IS NULL THEN Occupation ELSE @Occupation END

我将参数值调整为 NULL。

上述查询对于空字符串返回空表。

SQL 查询:当参数为 NULL 时选择所有数据的示例 3
在此,我们在 WHERE 子句 中使用 OR 运算符 和 IS NULL 来检查参数值是否为 NULL。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Skilled Manual'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = @Occupation OR
@Occupation IS NULL

您可以看到,对于 NULL 值,该查询返回所有记录。

并且它为 blank 值返回空表。

SQL 查询:当参数为空或 NULL 时选择所有数据
在此示例中,我们使用了 IIF 函数 和 ISNULL。首先,ISNULL 函数检查参数值是否为 NULL。如果为真,它会将值替换为空字符串或空白。接下来,IIF 将检查参数是否为空。如果为真,Occupation = Occupation,否则 Occupation = 用户提供的结果。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Management'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = IIF(ISNULL(@Occupation, '') = '', Occupation, @Occupation)

让我们将参数值更改为 NULL。

对于空参数值,它返回 Employee 表中的所有记录。

SQL 查询:当参数为空或 NULL 时选择所有数据的示例 2
在此 SQL 示例中,我们使用 OR 运算符 和 ISNULL 函数。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Clerical'
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
WHERE Occupation = @Occupation OR
ISNULL(@Occupation, '') = ''

NULL 参数的结果

空字符串的结果

SQL 查询:当参数为 NULL 时选择所有数据的示例 3
在这里,我们使用 IF-ELSE 语句。如果参数值不为 NULL,我们使用带 Where 子句的 Select 语句,否则,则不带 Where 子句。
DECLARE @Occupation VARCHAR(50)
SET @Occupation = 'Professional'
IF ISNULL(@Occupation, '') <> ''
BEGIN
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [SQL Tutorial].[dbo].[Employee]
WHERE Occupation = @Occupation
END
ELSE
BEGIN
SELECT [EmpID]
,[FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
END

NULL 参数的结果

空字符串结果
