在SQLServer2005中处理比较测试中的空值
今天我正在编写一个存储过程,遇到了一个问题,如果其中一个值为null(无论是来自在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 &
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