为什么LIKE'%'不匹配''或NULL

use*_*460 2 sql oracle null sql-like

基本上我有一组用户可以搜索的字段.所以我写了一个表格的查询:

SELECT *
  FROM my_addr_vw
 WHERE     fname LIKE :l_fname
  AND mname LIKE :l_mname
  AND lname LIKE :l_lname;
Run Code Online (Sandbox Code Playgroud)

当用户未将任何值传递给任何条件时,我假设为'%'.

这样做,如果一个记录有NULL或没有值,比方说,mname - 然后记录下降....什么是这个问题的一个很好的解决方案没有匹配!

Gor*_*off 5

几乎任何比较NULL产生一个未知的(我认为作为NULL比较的结果).这包括like- 对于模式和被比较的字符串.

where只有当比较为TRUE时,该子句才允许行通过.因此,FALSE和unknown都被过滤掉了.

这解释了这NULL件作品.这''有点深奥,因为这里的Oracle与其他数据库和标准不同.Oracle将NULL空字符串视为相同.所以,''它实际上只是NULL(使用默认的Oracle设置)的同义词.所以,你无法将任何东西与空字符串匹配,就像你无法匹配任何东西一样NULL.