在SQL Server 2005中处理比较测试中的空值

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)

我知道我错过了一些简单的东西,任何人都知道它是什么?

相关问题

SQL:为什么NULL在此WHERE子句中过滤掉了值?

cjk*_*cjk 5

处理此问题的一种方法是将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测试代码保持"无杂乱".