Можете да сравните колоната и стойността, за да видите дали и двете са нулеви; или и двете са ненулеви и равни:
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)
Което не е много красиво, но трябва да работи. Както вече знаете, не можете да сравнявате стойности срещу null с равенство, само is
оператор.
В зависимост от вашия клиентски софтуер може да сте в състояние да използвате именувани променливи за свързване, за да избегнете необходимостта от повтаряне на свързванията; ако не, можете да използвате подзаявка или CTE, която взема свързванията и след това да ги използвате в основната заявка. Нещо като:
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)
Базираният на функцията индексен подход на Гордън може да е по-надежден и по-лесен за разбиране, стига наистина да не можете да имате колони с магическа стойност нула. (И аз бях пропуснал този ред във вашия въпрос и не бях разбрал, че вече сте го отстъпили!)