我有一个简单的查询(实际查询会更复杂。它是一个动态查询)
SELECT * FROM Employee WHERE @firstName IS NULL OR firstName LIKE @firstName
@firstName将作为
传递当@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吗?
我检查了这个LIKE语法https://www.w3schools.com/SQl/sql_like.asp
和https://msdn.microsoft.com/en-us/library/ms179859.aspx
但我没有找到答案。谢谢!
答案 0 :(得分:2)
LIKE NULL
对于支持或实现SQL 92标准的RDBMS,不是一个有意义的表达式。
首先,NULL [一直回到C.J.Date]意味着“未知”,所以没有什么可以是'LIKE'未知。
NULL的唯一有效测试是“IS NULL”或“IS NOT NULL”。
答案 1 :(得分:1)
是的,LIKE NULL
在所有RDBMS中都有效。 LIKE
是一个后跟字符串的运算符,字符串可以为null;所以没问题。
将值与NULL
进行比较,无论哪个运算符(<
,<=
,=
,<>
,LIKE
等。 - IS
除了特别要与NULL
进行比较外),结果为UNKNOWN
。 UNKNOWN
不是TRUE
,因此NULL
的情况不符合条件。无论如何,如果@firstName
包含NULL
,@firstName IS NULL
的评估结果为TRUE
,那么LIKE @firstName
导致的结果就不重要了(因为{{当两个条件中的至少一个为@firstName IS NULL OR firstName LIKE @firstName
时,1}}为TRUE
。
答案 2 :(得分:0)
以前曾经问过这个问题。以下是一个很好的答案:
like '%' does not accept NULL value
Behaviour of NOT LIKE with NULL values
如果您只是想检查值是否为空 - 那么请使用语法:
SELECT * FROM Employee WHERE firstName IS NULL
(NULL IS NULL将始终返回true - 它与“WHERE 1 = 1”相同)。希望这有所帮助。