Geo*_*ker 1 sql t-sql sql-server
我今天正在写一个存储过程,我遇到了一个问题,如果其中一个值为null(无论是来自SELECT语句还是传入参数),我的表达式将评估为false,它应该评估为真正.
SET ANSI_NULLS ON;
DECLARE @1 INT;
DECLARE @2 INT;
DECLARE @3 INT;
DECLARE @4 INT;
SET @1 = 1;
SET @2 = NULL;
SET @3 = 3;
SET @4 = 3;
IF ((@1 <> @2) OR (@3 <> @4))
BEGIN
SELECT 1;
END
ELSE
BEGIN
SELECT 2;
END
SELECT @1, @2, @3, @4
Run Code Online (Sandbox Code Playgroud)
返回:
2
1, NULL, 3, 3
Run Code Online (Sandbox Code Playgroud)
我希望它能回归:
1
1, NULL, 3, 3
Run Code Online (Sandbox Code Playgroud)
我知道我错过了一些简单的东西,任何人都知道它是什么?
处理此问题的一种方法是将NULL值包装在已知的意外值中,即-1:
IF ((ISNULL(@1, -1) <> ISNULL(@2, -1)) OR (ISNULL(@3, -1) <> ISNULL(@4, -1)))
BEGIN
SELECT 1;
END
ELSE
BEGIN
SELECT 2;
END
Run Code Online (Sandbox Code Playgroud)
显然,如果-1有可能,那么使用不同的数字.如果没有不可能的值,那么您将不得不使用CASE语句.
将NULL值分配给"安全"值的简明方法如下:
SET @1 = ISNULL(@1, -1)
这允许contional测试代码保持"无杂乱".