2008-09-17 12 views

उत्तर

167

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

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

या आप @N. J. Reed अंक बाहर की तरह एक अगर बयान का उपयोग कर सकते हैं।

+0

[लेखक द्वारा अद्यतन के बाद नोट]: यह काम करना चाहिए, लेकिन आपको यह सुनिश्चित करने के लिए दोनों पक्षों को टीआरआईएम() चाहिए कि एक मैच मिल जाए। मुझे आंत महसूस हो रहा है कि अभी भी दुर्लभ मामले हैं जो मैच में असफल हो जाते हैं। –

+1

'केस' का उपयोग करना ज्यादातर मामलों में उचित समाधान है। मेरे मामले में, मैं तुलना ऑपरेटर को बदलना चाहता था और इसलिए मैंने अगले दृष्टिकोण का उपयोग किया। – Birla

6

यदि के बजाय एक CASE बयान का प्रयोग करें।

4

आप मामले बयान चाहते

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

आप किसी भी अगर या मामला

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

बिना यह करने के लिए एसक्यूएल के स्वाद के आधार पर आप पर डाले tweak करना पड़ सकता है सक्षम होना चाहिए निहित संख्या समर्थित हैं या नहीं, इस पर निर्भर करता है कि एक आईएनटी या वचरर को आदेश संख्या।

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

+1

मुझे लगता है कि आप केस समाधान पर थोड़ा सा प्रदर्शन हिट करते हैं, हालांकि, उन सभी स्थितियों का मूल्यांकन किया जाता है, नहीं? –

+0

परफेक्ट - मेरे लिए एक लंबे समय तक खड़ी समस्या हल हो गई; सूचक के लिए धन्यवाद! – cori

+0

मैं हमेशा भूल जाता हूं कि एसक्यूएल में बूलियन तर्क के साथ सशर्त बयानों को प्रतिस्थापित कर सकते हैं। अनुस्मारक के लिए धन्यवाद, यह एक बहुत ही उपयोगी तकनीक है! – CodexArcanum

13

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

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 (IsNumeric(@OrderNumber)) = 1 
BEGIN 
    SELECT * FROM Table 
    WHERE @OrderNumber = OrderNumber 
END ELSE BEGIN 
    SELECT * FROM Table 
    WHERE OrderNumber LIKE '%' + @OrderNumber 
END 

3) एक लंबी स्ट्रिंग का उपयोग करते हुए बाहर, अपने एसक्यूएल रचना कथन सशर्त रूप से, और उसके बाद EXEC

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

+0

चौथा दृष्टिकोण आपके सभी 'IF ... ELSE ...' कंडीशनर को बुलियन 'AND' और' OR' जैसा ऊपर @ njr101 उत्तर में परिवर्तित करना है।^इस दृष्टिकोण से यह है कि यदि आपके पास कई 'आईएफ' हैं, या यदि आपके पास कई हैं जो – mmcrae

3

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

परिदृश्य: मान लीजिए कि यदि आप मूर्ख हैं तो व्यक्ति -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; 
1
 
WHERE (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) 
      AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' 
               + @OrderNumber + '%') 
+0

घोंसले हैं तो संगत सामान्य फॉर्म फिर से लिखने के नियम हैं:' अगर पी क्यू ईएलएसई आर' '<=>' '((पी नहीं) या क्यू) और (पी या आर)' – onedaywhen

-6
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 
+0

यह प्रासंगिक प्रतीत नहीं होता है। यह WHERE खंड में एक आईएफ (या कोई सशर्त कोड) का उपयोग नहीं करता है। –

0

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

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 

नेस्ट का उपयोग कर ... और बयानों निम्न उदाहरण दिखाता है कि कैसे एक अगर ... और बयान एक और अंदर नेस्टेड जा सकता है। प्रत्येक कथन का परीक्षण करने के लिए @Number चर को 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 
+1

यह प्रासंगिक प्रतीत नहीं होता है। यह WHERE खंड में एक आईएफ (या कोई सशर्त कोड) का उपयोग नहीं करता है। –

12

आपको एक आईएफ कथन की आवश्यकता नहीं है।

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

मुझे वास्तव में यह दृष्टिकोण पसंद है। Alternativ उपयोग करता है: केवल फ़िल्टर कर AdmUseId एक मूल्य है: 'जहां (@AdmUserId रिक्त है या CurrentOrder.CustomerAdmUserId = @AdmUserId)' या केवल फ़िल्टर कर IncludeDeleted = 0: 'जहां (@IncludeDeleted = 1 या ItemObject.DeletedFlag = 0) ' –

संबंधित मुद्दे