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.
我正在尝试编写一个 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.