代码之家  ›  专栏  ›  技术社区  ›  Preet Sangha

如果literal不包含通配符,我为什么不能将isNull(col,literal)替换为col<>literal?

  •  2
  • Preet Sangha  · 技术社区  · 5 年前

    我遇到了一些旧代码,比如这个例子:

        DECLARE @tmpVal INT = 999
    
        DECLARE @tmpTable TABLE (col1 INT, col2 VARCHAR(20))
    
        INSERT INTO @tmpTable (col1, col2)
        VALUES 
            (1, 'Do not want this'),
            (2, 'Happy with this'),
            (3, NULL)
    
        SELECT
            col1,
            col2,
            -- I see code like this
            CASE
                WHEN ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this'
                THEN @tmpVal
            END                                                 AS CurrentCol,
    
            -- can I replace it with code like this because there is no else?
            CASE
                WHEN col2 <> 'Do not want this'
                THEN @tmpVal
            END                                                 AS BetterCol
    
        FROM 
            @tmpTable
    

    我的想法是 ISNULL(col2, 'Do not want this') NOT LIKE 'Do not want this' 应替换为 col2 <> 'Do not want this' 因为它完美地处理了空的情况。

    enter image description here

    我可以使用BetterCol中的表单而不是CurrentCol中的表单作为when表达式,如果不是,为什么?有没有我看不到的边缘案例?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Zohar Peled    5 年前

    tl;dr;-是的,你可以换掉它-它(几乎)完全安全。

    较长版本:

    在SQL Server中,除非 SET ANSI_NULL OFF 指定了(实际上不应该指定它-请注意,它已被弃用)-将任何内容与 null 结果是 UNKNOWN ,基本上相当于 false 对于 case 表达式或 where 子句谓词。

    这意味着 SomeValue <> NULL SomeValue = NULL 甚至 NULL = NULL NULL <> NULL 都会回来 未知

    尽管我没有找到任何关于 NULL 以及 LIKE 接线员(我已经查过了 SET ANSI_NULL , LIKE NULL and UNKNOWN 文件)众所周知的事实是 无效的 和那个一样吗 like 操作人员 = 运算符-含义 NULL LIKE 'some string' 将返回 未知 也。