在T-SQL中比较两个可以使用NULL的变量

时间:2015-11-30 11:43:55

标签: sql-server tsql

假设我有两个可能为NULL的变量,我想检查它们是否不同。

但是,我想:

  • 将两个NULL视为相等(不是NULL)。
  • 将NULL和非NULL视为不相等(不是NULL)。

我知道我可以写:

DECLARE @v1 int = ...;
DECLARE @v2 int = ...;

IF (
    (@v1 IS NULL AND @v2 IS NOT NULL)
    OR (@v1 IS NOT NULL AND @v2 IS NULL)
    OR @v1 <> @v2
)
    PRINT 'Different!';

但是有更优雅的方式吗?

6 个答案:

答案 0 :(得分:5)

只是为了表明有很多方法可以做到。

IF EXISTS(SELECT @v1 EXCEPT SELECT @v2)
    PRINT 'Different'

答案 1 :(得分:1)

还有一个选择,但我不确定它是否会更优雅。

IF NOT(NULLIF(@v1, @v2) IS NULL AND NULLIF(@v2, @v1) IS NULL)
PRINT 'Different!';

答案 2 :(得分:0)

尝试这样的事情:

DECLARE @v1 INT = ...;
DECLARE @v2 INT = ...;

IF ISNULL(@v1, -1) <> ISNULL(@v2, -1)
    PRINT 'Different!'

答案 3 :(得分:0)

DECLARE @v1 INT = NULL
DECLARE @v2 INT = 1

IF CHECKSUM(@v1) != CHECKSUM(@v2)
    PRINT 'Different!'

答案 4 :(得分:0)

我们经常使用null等效值,这是一个对数据类型有效但在程例如,如果您的程序仅使用正整数,则使用等效值为null的值意味着可能存在以下情况:

IF ISNULL(@v1, -1) != ISNULL(@v2, -1) -- or COALESCE if you prefer
    PRINT 'Different!';

如果整个范围的整数值是有效条目,则不能使用空等效值。如果是这样的话,原始方法绝对没有问题。

我会建议任何人不要对这样的事情过于聪明,这会让你以后痛苦。保持简单!

答案 5 :(得分:0)

还有一个选项是:

SET ANSI_NULLS OFF
IF @v1 != @v2 
    PRINT 'Different!';
SET ANSI_NULLS ON