आप यह देखने के लिए कॉलम और मान की तुलना कर सकते हैं कि दोनों शून्य हैं या नहीं; या दोनों शून्य और बराबर नहीं हैं:
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)
जो बहुत सुंदर नहीं है लेकिन काम करना चाहिए। जैसा कि आप पहले से ही जानते हैं कि आप शून्य के विरुद्ध समानता के साथ मूल्यों की तुलना नहीं कर सकते, केवल is
ऑपरेटर।
आपके क्लाइंट सॉफ़्टवेयर के आधार पर आप बाइंडिंग को दोहराने से बचने के लिए नामित बाइंड चर का उपयोग करने में सक्षम हो सकते हैं; यदि नहीं, तो आप एक सबक्वायरी या सीटीई का उपयोग कर सकते हैं जो बाइंड लेता है और फिर उन्हें मुख्य क्वेरी में उपयोग करता है। कुछ इस तरह:
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)
गॉर्डन का फ़ंक्शन-आधारित इंडेक्स दृष्टिकोण अधिक विश्वसनीय और समझने में आसान हो सकता है, जब तक कि आपके पास वास्तव में जादुई मान शून्य वाला कोई कॉलम नहीं हो सकता है। (मैं आपके प्रश्न में भी उस पंक्ति से चूक गया था और यह महसूस नहीं किया था कि आप इसे पहले ही छूट दे चुके हैं!)