2012-05-11 16 views
5

वर्तमान में मैं है एक संग्रहीत proc है, जो एक स्ट्रिंगआशुलिपि अगर एसक्यूएल में बयान

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

लेता है वहाँ बयान करता है, तो इनलाइन करने के लिए किसी भी तरह से है, जिससे की घोषणा नहीं 2 के सिर्फ 1 परम की वजह से चुनें?

+0

तुम भी एक मामला बयान के साथ ऐसा कर सकते हैं, यह नीचे, लेकिन कुछ मामलों में यह बेहतर है में जवाब के रूप में कम नहीं है । – Purplegoldfish

+0

मैं आपका कोड नहीं बदलूंगा, क्योंकि ज्यादातर मामलों में एसक्यूएल संयुक्त 'या मानदंडों की तुलना में अधिक बेहतर निष्पादन योजना उत्पन्न करेगा। –

उत्तर

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

यह काम करता है, लेकिन मेरा अगला प्रश्न: क्यों? क्या ब्रैकेट केवल पहले मानदंडों को सत्य के रूप में मूल्यांकन करते हैं या फिर रोकते हैं ...? – Alex

+3

@Alex: यह अभी भी दोनों मानदंडों का मूल्यांकन करता है, लेकिन 'या' की वजह से, परिणाम सेट में पंक्ति को शामिल करने के लिए कोई भी सत्य हो सकता है। यदि '@vari शून्य है ', तो प्रत्येक पंक्ति वापस कर दी जाएगी क्योंकि पहला भाग हमेशा सत्य है। अन्यथा, लौटाई गई एकमात्र पंक्तियां दूसरे भाग से मेल खाती हैं, 'col = @ vari', जो फ़िल्टर को लागू करती है। – mellamokb

+2

ब्रैकेट यहां हैं क्योंकि मेरे पास ओआरएस को कोष्ठक में डालने की आदत है। –

3

मान लिया जाये कि col शून्य कभी नहीं है, तो आप ऐसा कर सकते हैं:

select * 
from table 
where col = isnull(@vari, col) 
संबंधित मुद्दे