Tsql 如果literal不包含通配符,为什么我不能用colliteral替换ISNULL(col,literal)notlike literal?

Tsql 如果literal不包含通配符,为什么我不能用colliteral替换ISNULL(col,literal)notlike literal?,tsql,sql-like,Tsql,Sql Like,我遇到了一些旧代码,比如下面的示例: 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) SEL

我遇到了一些旧代码,比如下面的示例:

    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
我的想法是,应该将ISNULLcol2、‘不要这个’和‘不要这个’替换为col2‘不要这个’,因为它可以完美地处理null情况


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

TL;博士;-是的,你可以更换它-它几乎是完全安全的

较长版本:

在SQL Server中,除非指定了,而且确实不应该指定它—请注意,它已被弃用—否则将任何内容与null进行任何比较都将产生未知值,这基本上相当于大小写表达式或where子句谓词的false

这意味着SomeValue NULL和SomeValue=NULL,甚至NULL=NULL和NULL-NULL都将返回UNKNOWN


虽然我在SET ANSI_NULL中没有找到NULL和类似操作符行为的任何文档,众所周知,对于like运算符和=运算符,null的行为是相同的,这意味着像'some string'这样的null也将返回UNKNOWN。

很少使用没有特殊字符(如%、\等)的like。请确保没有这样的行为,以便安全地替换表达式。您还可能从索引中获益,因为ISNULL将使它们的使用无效,因为它将函数应用于跟踪列。谢谢。是的,我们使用的是ANSINULLS,因此我试图理解为什么代码没有这样写!