T-SQL - 将两个变量值与可能的 NULL 进行比较

T-SQL - Comparing two variables values with possible NULL

我正在尝试编写一个 T-SQL 语句来比较两个可为 null 的变量(int 或 varchar),@x@y,以及 return如果两个值相等或两个值都等于 NULL,则为 FALSE,否则为 return TRUE。 A 和 B 都是可能值的占位符。

+------+------+--------+
| @x   | @y   | Result |
+------+------+--------+
| NULL | NULL | False  |
| A    | A    | False  |
| B    | A    | True   |
| A    | B    | True   |
| NULL | A    | True   |
| A    | NULL | True   |
+------+------+--------+

我可以使用 COALESCE(@x,@y) 来验证 @x@y 都是 NULL。由于任何值都不能等于(或不等于)NULL,所以我不能使用 <> 或 = 运算符。写这样的陈述最紧凑的方法是什么?我是否必须声明一堆条件,例如:(@x is not NULL and @y is not null and @x <> @y) or (@x is not null and @y is null) or (@x is null and @y is not null)?

这个呢?错误时...

ISNULL(@x,'') = ISNULL(@y,'')

下面的怎么样:

DECLARE @x varchar(10) = 'b',
        @y varchar(10) = 'a';


SELECT CASE WHEN COALESCE(@x,'') = COALESCE(@y,'') THEN 'FALSE'
            ELSE 'True'
       END AS Test

请注意,您可能想为 COALESCE(@x,'') 选择一些随机值...您在数据中永远找不到的东西。

您可以使用 Coalesce 检查两个 NULL 值并使用 = 检查相等的非 NULL 值:not( Coalesce( @x, @y ) is NULL or @x = @y ).

注意下面的代码没有引入魔法值,例如通过使用 Coalesce( A, '' ),数据中不得出现这种情况。

正如 Dale K. 建议的那样,将函数应用于 where 子句中的列 通常 呈现条件 un-sargable

declare @Samples as Table ( X VarChar(1), Y VarChar(1) );
insert into @Samples ( X, Y ) values
  ( NULL, NULL ), ( 'A', 'A' ), ( 'B', 'A' ), ( 'A', 'B' ), ( NULL, 'A' ), ( 'A', NULL );

select X, Y,
  -- Note: The result values are flipped rather than including   not   in the condition.
  case when Coalesce( X, Y ) is NULL or X = Y then 'False' else 'True' end as Result
  from @Samples;

演示:db<>fiddle.