ユーザーがプロシージャに渡されたパラメータに基づいてOracleテーブルのレコードを検索および編集できるWebフォームがあります。これが私のデータです:
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
そして、ここに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)
パラメータでnvlを使用すると、いずれかのパラメータに値がある場合は一致したレコードのみが返され、どのパラメータにも値がない場合はすべてのレコードが返されます。すべてかなり標準的かそこらだと思いました。ただし、パラメータ値を指定せずに検索を実行すると、クエリはSEC_CODEがnullのレコードを返しません。つまり、レコード1、2、3、および6のみが返されます。上記のwhere句には、SEC_CODE値がnullのレコードを含めるべきではありませんか?