Oracle nvl在where子句中显示奇怪的结果?

Cia*_*uen 2 oracle plsql nvl

我有一个Web表单,允许用户根据传入proc的参数搜索和编辑Oracle表中的记录.这是我的数据:

CAE_SEC_ID  SEC_CODE  APPR_STATUS
1           ABC1      100
2           ABC2      100
3           ABC3      101
4           (null)    101
5           (null)    102
6           ABC4      103
Run Code Online (Sandbox Code Playgroud)

这是where子句:

select foo 
  from bar 
 where CAE_SEC_ID = NVL(p_cae_sec_id,CAE_SEC_ID)
   and Upper(SEC_CODE) like '%' || Upper(NVL(p_sec_code,SEC_CODE)) || '%'
   and APPR_STATUS = NVL(p_appr_status, APPR_STATUS)
Run Code Online (Sandbox Code Playgroud)

如果任何参数具有值,则对参数使用nvl应仅返回匹配的记录,如果所有参数都没有值,则应返回所有记录.所有相当标准或我认为.但是,当我在没有任何参数值的情况下进行搜索时,查询不会返回具有空SEC_CODE的记录,即仅返回记录1,2,3和6.上面的where子句不应该包含具有空SEC_CODE值的记录吗?

Jus*_*ave 7

问题是SEC_CODE表中的值为NULL.这意味着它UPPER(sec_code)是NULL,你的第二个谓词简化为

and NULL LIKE '%%'
Run Code Online (Sandbox Code Playgroud)

就像NULL不等于任何东西并且不等于任何东西,它不像任何东西.最有可能的是,你需要类似的东西

and (Upper(SEC_CODE) like '%' || Upper(NVL(p_sec_code,SEC_CODE)) || '%' or
     (sec_code is null and p_sec_code is null))
Run Code Online (Sandbox Code Playgroud)

如果P_SEC_CODE为NULL,则返回每一行,但如果P_SEC_CODE为非NULL,则仍然应用过滤器.