2017-02-27 113 views
0

我有一个简单的查询(实际查询将更加复杂,它是一个动态的查询)SQL LIKE NULL是否为所有数据库的有效语法?

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

@firstName将原样传递

  • NULL
  • '%名称%'

当@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 -- I guess 

我的问题是

的firstName LIKE NULL上的所有SQL数据库都有效?

它会一直评估为FALSE吗?

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

https://msdn.microsoft.com/en-us/library/ms179859.aspx

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

回答

1

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

值相较于NULL,不管是什么运营商(<<==<>LIKE等 - 除了IS其中特别提出与NULL比较),结果UNKNOWNUNKNOWN不是TRUE,所以在NULL的情况下不符合条件。不管怎样,如果@firstName包含NULL@firstName IS NULL计算结果为TRUE,所以它甚至不不管什么LIKE @firstName结果,然后(因为@firstName IS NULL OR firstName LIKE @firstNameTRUE当两个条件至少有一个是TRUE)。

+0

谢谢你的回答! Upvoted! – Loc

+0

我在Mssql,MySQL,PostgreSQL,SQLite上测试了LIKE NULL。他们工作得很好。但是它在Oracle数据库上失败了。 – Loc

+0

*如何失败?在Oracle 11.2中它对我来说工作得很好。我真的怀疑任何Oracle版本都不能正确处理这个问题。这将是一个严重的错误。 –

2
LIKE NULL 

对于支持或实现SQL 92标准的RDBMS不是一个有意义的表达式。

首先,NULL [回到C.J.日期]意味着“未知”,所以没有什么可以是'LIKE'未知。

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

+0

我同意LIKE NULL对于RDBMS没有意义,但它是否有效的语法并将被评估为FALSE? – Loc

+0

未定义/行为未在SQL 92标准中定义。 MS SQL行为在其他引擎中不一致。 –

+0

我需要测试一些流行的RDBMS上的查询。谢谢! – Loc

相关问题