【问题标题】:Is SQL LIKE NULL valid syntax for all database?SQL LIKE NULL 是所有数据库的有效语法吗?
【发布时间】:2017-02-27 16:40:19
【问题描述】:

我有一个简单的查询(实际查询会更复杂,是动态查询)

SELECT * FROM Employee WHERE @firstName IS NULL OR firstName LIKE @firstName 

@firstName 将被传递为

  • '%name%'

当@firstName 作为“%name%”传递时。查询将正常工作。

当@firstName 作为 NULL 传递时。查询将是:

SELECT * FROM Employee WHERE NULL IS NULL OR firstName LIKE NULL

// This query is valid syntax on MSSQL and return all employees
// because NULL IS NULL evaluated as TRUE
// And firstName LIKE NULL evaluated as FALSE

我的问题是

firstName LIKE NULL 对所有 SQL 数据库都有效吗?它是否总是被评估为 FALSE?

我已经检查了这个 LIKE 语法https://www.w3schools.com/SQl/sql_like.asp

还有这个https://msdn.microsoft.com/en-us/library/ms179859.aspx

但我没有找到答案。谢谢!

【问题讨论】:

    标签: sql rdbms sql-like


    【解决方案1】:
    LIKE NULL
    

    对于支持或实现 SQL 92 标准的 RDBM 来说,这不是一个有意义的表达式。

    首先,NULL [一直回到 C.J. Date] 的意思是“未知”,所以没有什么是“LIKE”未知的。

    NULL 的唯一有效测试是“IS NULL”或“IS NOT NULL”。

    【讨论】:

    • 我同意 LIKE NULL 对 RDBMS 没有意义,但它是有效的语法并且会被评估为 FALSE?
    • 未定义/SQL 92 标准中未定义的行为。 MS SQL 行为在其他引擎中不一致。
    • 我需要在一些流行的 RDBMS 上测试查询。谢谢!
    【解决方案2】:

    是的,LIKE NULL 在所有 RDBMS 中都有效。 LIKE 是一个运算符,后面跟一个字符串,字符串可以为空;所以没问题。

    将值与NULL 进行比较,无论是什么运算符(<<==<>LIKE 等 - 除了专门用于比较的 IS使用NULL),结果为UNKNOWNUNKNOWN不是TRUE,所以NULL的情况不满足条件。无论如何,如果@firstName 包含NULL@firstName IS NULL 的计算结果为TRUE,因此LIKE @firstName 的结果甚至都无关紧要(因为@firstName IS NULL OR firstName LIKE @firstNameTRUE 当至少一个这两个条件是TRUE)。

    【讨论】:

    • 我在 Mssql、MySQL、PostgreSQL、SQLite 上测试了 LIKE NULL。他们工作得很好。但它在 Oracle 数据库上失败了。
    • 如何失败了?它在 Oracle 11.2 中对我来说很好用。而且我实际上怀疑任何 Oracle 版本都不能正确处理这个问题。那将是一个严重的错误。
    • 我使用了 sqlfiddle。我刚刚又测试了。似乎 sqlfiddle Oracle 有问题,所以查询不起作用。我会接受这个答案。谢谢!
    【解决方案3】:

    以前有人问过这个问题。这里有一些很好的答案:

    like '%' does not accept NULL value

    Behaviour of NOT LIKE with NULL values

    如果您只是想检查值是否为 NULL- 则使用以下语法:

    SELECT * FROM Employee WHERE firstName IS NULL

    (NULL IS NULL 将始终返回 true - 它与“WHERE 1 = 1”相同)。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-03-13
      • 1970-01-01
      • 2018-10-12
      • 2014-12-17
      相关资源
      最近更新 更多