Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLServer2005中处理比较测试中的空值_Sql_Sql Server_Tsql - Fatal编程技术网

在SQLServer2005中处理比较测试中的空值

在SQLServer2005中处理比较测试中的空值,sql,sql-server,tsql,Sql,Sql Server,Tsql,今天我正在编写一个存储过程,遇到了一个问题,如果其中一个值为null(无论是来自SELECT语句还是传入的参数),我的表达式将在应该计算为true的地方计算为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 &

今天我正在编写一个存储过程,遇到了一个问题,如果其中一个值为null(无论是来自
SELECT
语句还是传入的参数),我的表达式将在应该计算为true的地方计算为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
我希望它会回来:

1

1, NULL, 3, 3
我知道我错过了一些简单的东西,有人知道是什么吗

相关问题


处理此问题的一种方法是,您可以将
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
如果((ISNULL(@1,-1)ISNULL(@2,-1))或(ISNULL(@3,-1)ISNULL(@4,-1)))
开始
选择1;
结束
其他的
开始
选择2个;
结束
显然,如果有可能使用
-1
,则使用不同的数字。如果没有不可能的值,则必须使用
CASE
语句

NULL
值分配给“安全”值的简明方法如下:

SET@1=ISNULL(@1,-1)


这允许连续测试代码保持“无杂波”。

处理此问题的一种方法是,您可以将
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
如果((ISNULL(@1,-1)ISNULL(@2,-1))或(ISNULL(@3,-1)ISNULL(@4,-1)))
开始
选择1;
结束
其他的
开始
选择2个;
结束
显然,如果有可能使用
-1
,则使用不同的数字。如果没有不可能的值,则必须使用
CASE
语句

NULL
值分配给“安全”值的简明方法如下:

SET@1=ISNULL(@1,-1)


这允许连续测试代码保持“无杂波”。

任何涉及NULL的比较都将计算为NULL,而不是True或False。因此,将执行代码的ELSE块。因为尽管Null与False不同,但它肯定与True不同。

任何涉及Null的比较都将计算为Null,而不是True或False。因此,将执行代码的ELSE块。因为尽管Null与False不同,但它肯定与True不同。

是的,Null是一种痛苦。处理这些问题的一些方法。其中一些是MS-SQL特定的函数:

方法1:明确所有选项

IF ((@1 <> @2) 
OR (@1 is NULL AND @1 IS NOT NULL)
OR (@1 is NOT NULL AND @1 IS NULL)
OR (@3 <> @4)
OR (@3 is NULL AND @4 IS NOT NULL)
OR (@3 is NOT NULL AND @4 IS NULL))

如果为空,则将其设置为-1。如果没有,它将不去管它。根据我的方法2,我认为在函数内部执行它更干净。

是的,空值是一种痛苦。处理这些问题的一些方法。其中一些是MS-SQL特定的函数:

方法1:明确所有选项

IF ((@1 <> @2) 
OR (@1 is NULL AND @1 IS NOT NULL)
OR (@1 is NOT NULL AND @1 IS NULL)
OR (@3 <> @4)
OR (@3 is NULL AND @4 IS NOT NULL)
OR (@3 is NOT NULL AND @4 IS NULL))

如果为空,则将其设置为-1。如果没有,它将不去管它。我认为,按照我的方法2,在函数内部执行更为简洁。

这里有一种不使用函数的方法,而且可能更易于阅读。(当我看到一群空测试函数靠在一起时,我的眼睛开始交叉。)


这里有一种不使用函数的方法,而且可能更容易阅读。(当我看到一群空测试函数靠在一起时,我的眼睛开始交叉。)


如果您想更加困惑,请尝试运行相反的测试,如下所示:

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) AND (@3 = @4))
   BEGIN     SELECT 1;
   ENDELSE   
   BEGIN     SELECT 2;   
   END
SELECT @1, @2, @3, @4
结果将不是你从先前的实验中所期望的

原因是SQL在求值时使用了复杂的三值逻辑 可能包含空值的表达式

NULL=3不是真的。这也不是假的。它是空的。 NULL=NULL不是真的。这也不是假的。它是空的

这很容易让人搞混。避免混淆的最佳方法是将所有关键数据约束为非空。然而,这些要求可能会阻止您这样做,在这种情况下,您只需要找出3值逻辑,SQL风格

别让我为这辩护


(在某些环境中,对于非真或假的结果,使用UNKNOWN代替NULL。)

如果您想更加困惑,请尝试运行相反的测试,如下所示:

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) AND (@3 = @4))
   BEGIN     SELECT 1;
   ENDELSE   
   BEGIN     SELECT 2;   
   END
SELECT @1, @2, @3, @4
结果将不是你从先前的实验中所期望的

原因是SQL在求值时使用了复杂的三值逻辑 可能包含空值的表达式

NULL=3不是真的。这也不是假的。它是空的。 NULL=NULL不是真的。这也不是假的。它是空的

这很容易让人搞混。避免混淆的最佳方法是将所有关键数据约束为非空。然而,这些要求可能会阻止您这样做,在这种情况下,您只需要找出3值逻辑,SQL风格

别让我为这辩护


(在某些环境中,对于不正确或错误的结果,使用UNKNOWN代替NULL。)

是的,我也这么推测。如果你有一个更干净的解决方案,我希望能找到一个更干净的解决方案。正如其他人所建议的那样,使用带伪值的IsNull()。或者用“@1 is null”类型检查来扩展您的逻辑。如果您想要更整洁的版本,也可以在前面的行中设置@1=IsNULL(@1,-1)。哇,我们都在争先恐后地告诉您同样的事情!是的,我也猜到了。如果你有一个更干净的解决方案,我希望能找到一个更干净的解决方案。正如其他人所建议的那样,使用带伪值的IsNull()。或者用“@1 is null”类型检查来扩展您的逻辑。如果您想要更整洁的版本,也可以在前面的行中设置@1=IsNULL(@1,-1)。哇,我们都在争先恐后地告诉您同样的事情!是的,你列出的第一个真相测试似乎不是一个可行的选择。我正在寻找一种简洁的方法,如果参数最终为null(作为传入的select语句或参数的结果),可以将参数重新分配给-1。有什么想法吗?是的,IsNull()就是这么做的!是的,你列出的第一个真相测试似乎不是一个可行的选择。我正在寻找一种简洁的方法,如果参数最终为空(作为select sta的结果),则将参数重新分配给-1
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) AND (@3 = @4))
   BEGIN     SELECT 1;
   ENDELSE   
   BEGIN     SELECT 2;   
   END
SELECT @1, @2, @3, @4