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

时间:2014-08-21 20:00:57

标签: 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;

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

这样做,如果一条记录有 NULL 或没有值,比方说,mname - 那么记录会下降....这个 NULL的问题有什么好的解决方案什么都不匹配!!

3 个答案:

答案 0 :(得分:5)

几乎与NULL的任何比较都会产生未知(我认为比较的NULL结果)。对于模式和要比较的字符串,这包括like

where子句仅在比较为TRUE时允许行通过。因此,FALSE和未知都被过滤掉了。

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

答案 1 :(得分:0)

您可以使用null语法返回带有is null值的记录:

 where (:l_mname = '%' and mname is null) or mname like :l_mname

答案 2 :(得分:0)

  

这个NULL问题的好方法是什么,什么都不匹配!

解决方案是使用IS NULLIS NOT NULL

SELECT *
FROM my_addr_vw
WHERE   (fname LIKE :l_fname OR fname IS NULL)
    AND (mname LIKE :l_mname OR mname IS NULL)
    AND (lname LIKE :l_lname OR lname IS NULL);