如果参数值为null或空白,如何跳过where子句中的条件检查?

时间:2016-01-13 08:34:22

标签: sql oracle

需要一点帮助。我正在进行一个运行select的存储过程调用。 (由于业务限制,我无法进入实际选择,但我会给你一个虚拟场景。)

这是一个存储过程:

Procedure checkData (name IN VARCHAR2, vehicle IN VARCHAR2, retval OUT VARCHAR2, retdata OUT returnData)

它内部的选择从文本框字段中获取用于搜索的值。选择就是这样,

select *
from myTable tab
WHERE tab.vehicle = vehicle
  AND tab.name = name

现在问题是当用户只指定上述2中的一个值时,搜索失败,因为它尝试根据AND条件检查详细信息

例如,如果用户仅提供车辆价值,请说'BMW',那么结果应包含车辆的所有条目。但是会发生什么情况是因为用户没有提供名称值,它将其视为''或null并且查询没有返回任何内容,因为它找不到任何匹配name = ''的数据条件。

所以我在下面试过,

select *
from myTable tab
WHERE tab.vehicle = vehicle
AND IF name IS NOT NULL OR name != ''
tab.name = name

但它说,

  

ORA-00920:无关的关系运算符。

那么,如果name的值为null或'',我该怎么办才能跳过第二次检查。在这种特定情况下,我只想跳过第二次检查并仅根据车辆值返回结果。

我无法使用OR条件,因为当两个参数都可用时,我也需要获得完全匹配。我正在使用Oracle DB。

感谢任何帮助。非常感谢。

2 个答案:

答案 0 :(得分:0)

假设表中的列车辆和名称始终不为空,您可以尝试这样的事情:

select *
from myTable tab
WHERE nvl(vehicle, tab.vehicle) = tab.vehicle
  AND nvl(name, tab.name) = tab.name

答案 1 :(得分:-1)

试试这个。

SELECT * FROM myTable tab
WHERE tab.vehicle=vehicle 
AND IFNULL(tab.name,1) = IF(tab.name IS NULL,1, name)