एक तरीका यह होगा कि
. के एक प्रकार का उपयोग किया जाए WHERE column = nvl(var, column)
हालांकि यहां दो नुकसान हैं:
-
यदि कॉलम शून्य है, तो यह खंड शून्य मानों को फ़िल्टर करेगा जबकि आपके प्रश्न में आप दूसरे मामले में शून्य मानों को फ़िल्टर नहीं करेंगे। आप नल को ध्यान में रखने के लिए इस खंड को संशोधित कर सकते हैं लेकिन यह बदसूरत हो जाता है:
WHERE nvl(column, impossible_value) = nvl(var, impossible_value)
बेशक अगर किसी तरह
impossible_value
कभी भी डाला जाता है तो आप किसी अन्य प्रकार की (मज़ेदार) समस्याओं में भाग लेंगे। - अनुकूलक इस प्रकार के खंड को ठीक से नहीं समझता है। यह कभी-कभी UNION ALL के साथ एक योजना तैयार करेगा लेकिन यदि कुछ
nvl
से अधिक हैं , पूर्ण रूप से मान्य अनुक्रमणिका मौजूद होने पर भी आपको पूर्ण स्कैन प्राप्त होगा।
यही कारण है कि जब बहुत सारे पैरामीटर होते हैं (उदाहरण के लिए बड़े रूप में कई खोज फ़ील्ड), मैं गतिशील एसक्यूएल का उपयोग करना पसंद करता हूं:
DECLARE
l_query VARCHAR2(32767) := 'SELECT ... JOIN ... WHERE 1 = 1';
BEGIN
IF param1 IS NOT NULL THEN
l_query := l_query || ' AND column1 = :p1';
ELSE
l_query := l_query || ' AND :p1 IS NULL';
END IF;
/* repeat for each parameter */
...
/* open the cursor dynamically */
OPEN your_ref_cursor FOR l_query USING param1 /*,param2...*/;
END;
आप EXECUTE IMMEDIATE l_query INTO l_result USING param1;
का भी उपयोग कर सकते हैं