【问题标题】:Any reasons why I can't replace ISNULL(col, literal) NOT LIKE literal with col <> literal if literal contains no wildcards?如果文字不包含通配符,为什么我不能用 col <> 文字替换 ISNULL(col, literal) NOT LIKE 文字?
【发布时间】:2019-06-10 01:31:58
【问题描述】:

我遇到过一些旧代码,类似于这个例子:

    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 &lt;&gt; 'Do not want this' 因为它可以完美地处理 null 情况。

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

【问题讨论】:

  • 很少使用没有%_ 等特殊字符的LIKE。确保没有特殊字符,这样您就可以安全地替换表达式。您还可能从索引中受益,因为 ISNULL 会因为将函数应用于跟踪列而使它们的使用无效。

标签: tsql sql-like


【解决方案1】:

TL;DR; - 是的,您可以更换它 - 它(几乎)非常安全。

更长的版本:

在 SQL Server 中,除非指定了 SET ANSI_NULL OFF(而且它真的不应该被指定 - 请注意它已被弃用) - 任何与 null 的比较都会导致 UNKNOWN,这基本上是相当于false 用于case 表达式或where 子句谓词。

这意味着SomeValue &lt;&gt; NULLSomeValue = NULL甚至NULL = NULLNULL &lt;&gt; NULL都将返回UNKNOWN

虽然我没有找到任何关于 NULLLIKE 运算符行为的文档(我在 SET ANSI_NULLLIKENULL and UNKNOWN 文档中进行了搜索),但众所周知的事实是null 的行为与 like 运算符和 = 运算符的行为相同 - 这意味着 NULL LIKE 'some string' 也将返回 UNKNOWN

【讨论】:

  • 谢谢。是的,我们正在使用 ANSI 空值 - 因此我试图理解为什么代码不是这样编写的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
相关资源
最近更新 更多