Sql server T-SQL-比较两个可能为空的变量值

Sql server T-SQL-比较两个可能为空的变量值,sql-server,tsql,null,Sql Server,Tsql,Null,我正在尝试编写一个T-SQL语句,该语句将比较两个可为NULL的变量(int或varchar),@x和@y,如果两个值都相等或都等于NULL,则返回FALSE,否则返回TRUE。A和B都是可能值的占位符 +------+------+--------+ | @x | @y | Result | +------+------+--------+ | NULL | NULL | False | | A | A | False | | B | A | True

我正在尝试编写一个T-SQL语句,该语句将比较两个可为NULL的变量(int或varchar),
@x
@y
,如果两个值都相等或都等于NULL,则返回FALSE,否则返回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,因此我不能使用or=运算符。写这样的声明最简洁的方式是什么?我是否必须声明一系列条件,例如:
(@x不为NULL且@y不为NULL且@x@y)或(@x不为NULL且@y为NULL)或(@x为NULL且@y不为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',)
选择一些随机值。。。在数据中找不到的东西。

您可以使用
合并
检查两个
空值
=
检查相等的非空值:
不(合并(@x,@y)为空或@x=@y)

请注意,以下代码不会引入神奇值,例如,通过使用
Coalesce(a'),
,该值不得出现在数据中

正如Dale K.所建议的,将函数应用于
where
子句中的列通常会呈现条件


演示:。

当这是查询中的选择列时,下面的答案就可以了。但您可能希望在where子句中坚持类似于
(@x不为NULL,@y不为NULL,@x@y)
,以确保可搜索性。这是否回答了您的问题?看到这个了吗
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;