基本上我有一组用户可以搜索的字段。所以我写了一个表格的查询:
SELECT *
FROM my_addr_vw
WHERE fname LIKE :l_fname
AND mname LIKE :l_mname
AND lname LIKE :l_lname;
当用户未将任何值传递给任何条件时,我假设为'%'。
这样做,如果一条记录有 NULL 或没有值,比方说,mname - 那么记录会下降....这个 NULL的问题有什么好的解决方案什么都不匹配!!
答案 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 NULL
或IS 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);