在 WHERE 中使用 NULL
Using NULL in WHERE
我的存储过程采用如下可选参数:
CREATE PROCEDURE MyProc
(
@P1 varchar(255) = NULL
)
AS
SELECT * FROM MyTable WHERE MyField = @P1
当@P1
为NULL
时,我要select所有记录。一种明显的方法是在此处使用 IF
,但我想在单个 SQL 语句中执行此操作。有人可以建议一种聪明的方法来实现这一目标吗?我正在考虑使用 ISNULL()
或 MyField = MyField
。也尝试了一些方法,但 NULL = NULL
不是 True
的事实是这里的主要障碍。
一种方式:
SELECT * FROM MyTable WHERE @P1 IS NULL OR MyField = @P1
另一种可能更有效的方法使用 If...Else
:
if(@P1 IS NULL)
begin
SELECT * FROM MyTable
End
Else
begin
SELECT * FROM MyTable WHERE MyField = @P1
End
WHERE MyField = ISNULL(@P1, MyField)
这应该能满足您的需求。
其他答案已经为您提供了直接的解决方案,但您需要使用 null:
您不能对 NULL
使用等式 (=
) 和不等式 (<>
) 运算符,因为 SQL 将 NULL
视为一个独特的值,永远不会等于任何东西(甚至它本身——null = null
是假的!)。
而是使用 value is null
和 value is not null
分别检查是否为 null。
我的存储过程采用如下可选参数:
CREATE PROCEDURE MyProc
(
@P1 varchar(255) = NULL
)
AS
SELECT * FROM MyTable WHERE MyField = @P1
当@P1
为NULL
时,我要select所有记录。一种明显的方法是在此处使用 IF
,但我想在单个 SQL 语句中执行此操作。有人可以建议一种聪明的方法来实现这一目标吗?我正在考虑使用 ISNULL()
或 MyField = MyField
。也尝试了一些方法,但 NULL = NULL
不是 True
的事实是这里的主要障碍。
一种方式:
SELECT * FROM MyTable WHERE @P1 IS NULL OR MyField = @P1
另一种可能更有效的方法使用 If...Else
:
if(@P1 IS NULL)
begin
SELECT * FROM MyTable
End
Else
begin
SELECT * FROM MyTable WHERE MyField = @P1
End
WHERE MyField = ISNULL(@P1, MyField)
这应该能满足您的需求。
其他答案已经为您提供了直接的解决方案,但您需要使用 null:
您不能对 NULL
使用等式 (=
) 和不等式 (<>
) 运算符,因为 SQL 将 NULL
视为一个独特的值,永远不会等于任何东西(甚至它本身——null = null
是假的!)。
而是使用 value is null
和 value is not null
分别检查是否为 null。