दिलचस्प पोस्ट
मैं jQuery के साथ एक तत्व का चयन कैसे कर सकता हूं? क्या गेटर्स और सेटर्स खराब डिज़ाइन हैं? विरोधाभासी सलाह नमूना http रेंज अनुरोध सत्र कैसे आरजीबी UIColor से मूल्य प्राप्त करने के लिए? उद्देश्य-सी में तथाकथित "कक्षा क्लस्टर" क्या है? आलोका कार्यान्वयन PHP प्रकार हिंटिंग पर मैं एक "पकड़ने वाला गंभीर त्रुटि" कैसे पकड़ सकता हूं? LayoutIfNeeded का उपयोग कैसे किया जाता है? अनुक्रमिक गिनती जेनरेटर jQuery के एजेक्स, क्वेरी के बजाय JSON भेजने के लिए कैसे करें जावा में अरैज़.एक्वल्स बनाम बराबर है सीमा चौड़ाई की तुलना में सीमा लंबाई छोटा? पायथन एनाकोंडा – कैसे सुरक्षित रूप से स्थापना रद्द करें मोंगोज के साथ एक पहले संग्रह का उपयोग कैसे करें? NSTextField अद्यतन करने के लिए एक लूप के अंत तक इंतजार कर रहा है

एसक्यूएल: यदि खंड जहां भीतर होता है I

क्या एमएस एसक्यूएल में एक WHERE क्लॉज के अंदर IF क्लॉज का उपयोग करना संभव है?

उदाहरण:

WHERE IF IsNumeric(@OrderNumber) = 1 OrderNumber = @OrderNumber ELSE OrderNumber LIKE '%' + @OrderNumber + '%' 

वेब के समाधान से एकत्रित समाधान "एसक्यूएल: यदि खंड जहां भीतर होता है I"

एक केस वक्तव्य का उपयोग करें
अद्यतन: पिछले वाक्य रचना (जैसा कि कुछ लोगों द्वारा बताया गया है) काम नहीं करता है आप निम्नानुसार CASE का उपयोग कर सकते हैं:

 WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END 

या आप IF स्टेटमेंट का उपयोग कर सकते हैं जैसे @ एनजे रीड बताते हैं।

आप ऐसा करने के लिए किसी भी अगर या मामले के बिना करने में सक्षम होना चाहिए

  WHERE (IsNumeric(@OrderNumber) AND (CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR) OR (NOT IsNumeric(@OrderNumber) AND OrderNumber LIKE ('%' + @OrderNumber)) 

एसक्यूएल के स्वाद के आधार पर आपको आईएनटी या वीएआरएआरएआर को ऑर्डर नंबर पर डाले जाने की ज़रूरत हो सकती है, इस पर निर्भर करता है कि क्या असंतुलित कच्छा समर्थित हैं या नहीं।

यह एक WHERE खंड में एक बहुत ही सामान्य तकनीक है यदि आप कुछ "IF" तर्क को लागू करने के लिए चाहते हैं जहां आपको सभी की आवश्यकता है, तो बुलियन के साथ और उस अनुभाग में अतिरिक्त शर्त जोड़कर जहां उसे लागू करने की आवश्यकता है

SQL में ऐसा करने का कोई अच्छा तरीका नहीं है मैंने देखा है कुछ दृष्टिकोण:

1) बूलियन ऑपरेटरों के साथ संयुक्त मामले का उपयोग करें:

 WHERE OrderNumber = CASE WHEN (IsNumeric(@OrderNumber) = 1) THEN CONVERT(INT, @OrderNumber) ELSE -9999 -- Some numeric value that just cannot exist in the column END OR FirstName LIKE CASE WHEN (IsNumeric(@OrderNumber) = 0) THEN '%' + @OrderNumber ELSE '' END 

2) चयन के बाहर यदि IF का उपयोग करें

 IF (IsNumeric(@OrderNumber)) = 1 BEGIN SELECT * FROM Table WHERE @OrderNumber = OrderNumber END ELSE BEGIN SELECT * FROM Table WHERE OrderNumber LIKE '%' + @OrderNumber END 

3) एक लंबी स्ट्रिंग का प्रयोग करके, अपने एसक्यूएल स्टेटमेंट को सशर्त रूप से लिखें, और फिर EXEC का उपयोग करें

तीसरा दृष्टिकोण घृणित है, लेकिन यह केवल एक ही ऐसा लगता है कि काम करता है, अगर आपके पास इस तरह की कई चर वाली स्थिति है।

आपको एक IF स्टेटमेंट की आवश्यकता नहीं है।

 WHERE (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber) OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%') 

IF की बजाए एक केस स्टेटमेंट का उपयोग करें

आप केस स्टेटमेंट चाहते हैं

 WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END 

मुझे लगता है कि जहां … जैसे / = … मामले … तब … बूलियन के साथ काम कर सकते हैं मैं टी-एसक्यूएल का उपयोग कर रहा हूँ

परिदृश्य: मान लीजिए कि आप व्यक्ति -30 के शौक चाहते हैं यदि बाल झूठी है, और व्यक्ति -42 के शौक अगर बूल सत्य है। (कुछ के अनुसार, शौक की खोज में व्यापारिक गणना चक्र के 90% से अधिक हिस्सा होता है, इसलिए पास के पास भुगतान करें।)।

 CREATE PROCEDURE sp_Case @bool bit AS SELECT Person.Hobbies FROM Person WHERE Person.ID = case @bool when 0 then 30 when 1 then 42 end; 
 WHERE (इज़्यूमरिक (@ ऑडरनंबर) <> 1 या ऑर्डर नंबर = @ ऑडर नंबर) 
              और (IsNumber (@OrderNumber) = 1 या '%' की तरह क्रम संख्या 
                                               + @ ऑडरनम्बर + '%')

निम्नलिखित उदाहरण बुलियन अभिव्यक्ति के हिस्से के रूप में क्वेरी को निष्पादित करती है और फिर बूलियन अभिव्यक्ति के परिणाम के आधार पर थोड़ा अलग बयान ब्लॉक निष्पादित करता है। प्रत्येक बयान ब्लॉक BEGIN के साथ शुरू होता है और END के साथ पूर्ण होता है।

 USE AdventureWorks2012; GO DECLARE @AvgWeight decimal(8,2), @BikeCount int IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 BEGIN SET @BikeCount = (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%'); PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.' PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.'; END ELSE BEGIN SET @AvgWeight = (SELECT AVG(Weight) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ); PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ; END ; GO 

नेस्टेड का उपयोग कर रहा है … ELSE बयान निम्नलिखित उदाहरण दिखाता है कि IF … ELSE कथन को किसी अन्य के अंदर नेस्ट किया जा सकता है। प्रत्येक स्टेटमेंट का परीक्षण करने के लिए 5, 50 और 500 के लिए @ नंबर चर सेट करें।

 DECLARE @Number int SET @Number = 50 IF @Number > 100 PRINT 'The number is large.' ELSE BEGIN IF @Number < 10 PRINT 'The number is small' ELSE PRINT 'The number is medium' END ; GO 
 If @LstTransDt is Null begin Set @OpenQty=0 end else begin Select @OpenQty=IsNull(Sum(ClosingQty),0) From ProductAndDepotWiseMonitoring Where Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt end 

देखें कि क्या यह मदद करता है

 USE AdventureWorks2012; GO IF (SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5 PRINT 'There are more than 5 Touring-3000 bicycles.' ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ; GO