U kunt de kolom en waarde vergelijken om te zien of beide null zijn; of beide zijn niet-null en gelijk:
SELECT * FROM MYTABLE
WHERE ((A is null and :1 is null) or A = :1)
AND ((B is null and :2 is null) or B = :2)
AND ((C is null and :3 is null) or C = :3)
AND ((D is null and :4 is null) or D = :4)
AND ((E is null and :5 is null) or E = :5)
Wat niet erg mooi is, maar zou moeten werken. Zoals je al weet, kun je waarden niet vergelijken met null met gelijkheid, alleen de is
telefoniste.
Afhankelijk van uw clientsoftware kunt u benoemde bindvariabelen gebruiken om te voorkomen dat u de bindingen moet herhalen; zo niet, dan zou u een subquery of CTE kunnen gebruiken die de bindingen opneemt en deze vervolgens in de hoofdquery gebruikt. Iets als:
WITH CTE AS (
SELECT :1 AS val_1, :2 AS val_2, :3 AS val_3, :4 AS val_4, :5 AS val_5
FROM DUAL
)
SELECT MT.*
FROM CTE
JOIN MYTABLE MT
ON ((MT.A is null and CTE.val_1 is null) or MT.A = CTE.val_1)
AND ((MT.B is null and CTE.val_2 is null) or MT.B = CTE.val_2)
AND ((MT.C is null and CTE.val_3 is null) or MT.C = CTE.val_3)
AND ((MT.D is null and CTE.val_4 is null) or MT.D = CTE.val_4)
AND ((MT.E is null and CTE.val_5 is null) or MT.E = CTE.val_5)
De op functies gebaseerde indexbenadering van Gordon is misschien betrouwbaarder en gemakkelijker te begrijpen, zolang je echt nooit kolommen kunt hebben met de magische waarde nul. (Ik had die regel in je vraag ook gemist en had me niet gerealiseerd dat je dat al had verdisconteerd!)