Not equal <> != operator on NULL

后端 未结 11 1531
南旧
南旧 2020-11-22 02:50

Could someone please explain the following behavior in SQL?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <         


        
11条回答
  •  醉话见心
    2020-11-22 03:37

    I would like to suggest this code I made to find if there is a change in a value, i being the new value and d being the old (although the order does not matter). For that matter, a change from value to null or vice versa is a change but from null to null is not (of course, from value to another value is a change but from value to the same it is not).

    CREATE FUNCTION [dbo].[ufn_equal_with_nulls]
    (
        @i sql_variant,
        @d sql_variant
    )
    RETURNS bit
    AS
    BEGIN
        DECLARE @in bit = 0, @dn bit = 0
        if @i is null set @in = 1
        if @d is null set @dn = 1
    
        if @in <> @dn
            return 0
    
        if @in = 1 and @dn = 1
            return 1
    
        if @in = 0 and @dn = 0 and @i = @d
            return 1
    
        return 0
    
    END
    

    To use this function, you can

    declare @tmp table (a int, b int)
    insert into @tmp values
    (1,1),
    (1,2),
    (1,null),
    (null,1),
    (null,null)
    
    ---- in select ----
    select *, [dbo].[ufn_equal_with_nulls](a,b) as [=] from @tmp
    
    ---- where equal ----
    select *,'equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 1
    
    ---- where not equal ----
    select *,'not equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 0
    

    The results are:

    ---- in select ----
    a   b   =
    1   1   1
    1   2   0
    1   NULL    0
    NULL    1   0
    NULL    NULL    1
    
    ---- where equal ----
    1   1   equal
    NULL    NULL    equal
    
    ---- where not equal ----
    1   2   not equal
    1   NULL    not equal
    NULL    1   not equal
    

    The usage of sql_variant makes it compatible for variety of types

提交回复
热议问题