Utilisez simplement coalesce
. C'est la manière la plus lisible et la plus compréhensible d'écrire cela. Étant donné que la logique est contenue dans un prédicat, il est plus facile de la maintenir et de la supprimer :
select * from job where id = coalesce(:i, id)
Comme demandé, une 'preuve' qui utilise en fait l'index :
create table x ( id number(15) null );
create unique index x_pk on x( id );
select id
from x
where id = coalesce(:x, id)
; -- Uses index
select id
from x
where id = :x or :x is null
; -- Full table scan
Forfait :