【问题标题】:T-SQL - Comparing two variables values with possible NULLT-SQL - 将两个变量值与可能的 NULL 进行比较
【发布时间】:2021-02-12 07:06:02
【问题描述】:

我正在尝试编写一个 T-SQL 语句,它将比较两个可空变量(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。由于没有任何值可以等于(或不等于)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)

【问题讨论】:

标签: sql-server tsql null


【解决方案1】:

以下内容如何:

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,'') 选择一些随机值...您在数据中永远找不到的东西。

【讨论】:

    【解决方案2】:

    这个呢?假时...

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

    【讨论】:

      【解决方案3】:

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

      请注意,以下代码没有引入 magic value,例如通过使用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.

      【讨论】:

        猜你喜欢
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2012-07-01
        相关资源
        最近更新 更多