Du kan sammenligne kolonnen og værdien for at se, om begge er nul; eller begge er ikke-nul og ens:
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)
Hvilket ikke er særlig kønt, men det burde virke. Som du allerede ved, kan du ikke sammenligne værdier med nul med lighed, kun is
operatør.
Afhængigt af din klientsoftware kan du muligvis bruge navngivne bindingsvariabler for at undgå at skulle gentage bindingerne; hvis ikke, kan du bruge en underforespørgsel eller CTE, som tager bindene og derefter bruge dem i hovedforespørgslen. Noget som:
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)
Gordons funktionsbaserede indekstilgang kan være mere pålidelig og lettere at forstå, så længe du virkelig aldrig kan have nogen kolonner med den magiske værdi nul. (Jeg havde også savnet den linje i dit spørgsmål og havde ikke indset, at du allerede havde regnet med det!)