क्या IFके भीतर खंड का उपयोग करना संभव है जहां एमएस एसक्यूएल में खंड?एसक्यूएल: IF क्लॉज के अंदर खंड
उदाहरण:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
क्या IFके भीतर खंड का उपयोग करना संभव है जहां एमएस एसक्यूएल में खंड?एसक्यूएल: IF क्लॉज के अंदर खंड
उदाहरण:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
एक CASE बयान
अद्यतन का उपयोग करें: पिछले वाक्य रचना (के रूप में कुछ लोगों द्वारा बताया) काम नहीं करता। इस प्रकार आप मामले का उपयोग कर सकते हैं:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
या आप @N. J. Reed अंक बाहर की तरह एक अगर बयान का उपयोग कर सकते हैं।
यदि के बजाय एक CASE बयान का प्रयोग करें।
आप मामले बयान चाहते
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
आप किसी भी अगर या मामला
WHERE
(IsNumeric(@OrderNumber) AND
(CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
OR
(NOT IsNumeric(@OrderNumber) AND
OrderNumber LIKE ('%' + @OrderNumber))
बिना यह करने के लिए एसक्यूएल के स्वाद के आधार पर आप पर डाले tweak करना पड़ सकता है सक्षम होना चाहिए निहित संख्या समर्थित हैं या नहीं, इस पर निर्भर करता है कि एक आईएनटी या वचरर को आदेश संख्या।
यह WHERE खंड में एक बहुत ही आम तकनीक है। यदि आप WHERE क्लॉज में कुछ "आईएफ" तर्क लागू करना चाहते हैं तो आपको केवल एक बूलियन के साथ अतिरिक्त स्थिति जोड़नी होगी और उस अनुभाग में जहां इसे लागू करने की आवश्यकता है।
मुझे लगता है कि आप केस समाधान पर थोड़ा सा प्रदर्शन हिट करते हैं, हालांकि, उन सभी स्थितियों का मूल्यांकन किया जाता है, नहीं? –
परफेक्ट - मेरे लिए एक लंबे समय तक खड़ी समस्या हल हो गई; सूचक के लिए धन्यवाद! – cori
मैं हमेशा भूल जाता हूं कि एसक्यूएल में बूलियन तर्क के साथ सशर्त बयानों को प्रतिस्थापित कर सकते हैं। अनुस्मारक के लिए धन्यवाद, यह एक बहुत ही उपयोगी तकनीक है! – CodexArcanum
एसक्यूएल में ऐसा करने का कोई अच्छा तरीका नहीं है। कुछ दृष्टिकोण मैंने देखा है:
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
तीसरा दृष्टिकोण घृणास्पद है, लेकिन यह लगभग एकमात्र ऐसा विचार है जो आपके पास ऐसी कई चरणीय स्थितियां हैं।
चौथा दृष्टिकोण आपके सभी 'IF ... ELSE ...' कंडीशनर को बुलियन 'AND' और' OR' जैसा ऊपर @ njr101 उत्तर में परिवर्तित करना है।^इस दृष्टिकोण से यह है कि यदि आपके पास कई 'आईएफ' हैं, या यदि आपके पास कई हैं जो – mmcrae
मुझे लगता है कि ... कहाँ/= ... मामला ... तो ... बूलियन के साथ काम कर सकता है। मैं टी-एसक्यूएल का उपयोग कर रहा हूं।
परिदृश्य: मान लीजिए कि यदि आप मूर्ख हैं तो व्यक्ति -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 (IsNumeric(@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) AND (IsNumber(@OrderNumber) = 1 OR OrderNumber LIKE '%' + @OrderNumber + '%')
घोंसले हैं तो संगत सामान्य फॉर्म फिर से लिखने के नियम हैं:' अगर पी क्यू ईएलएसई आर' '<=>' '((पी नहीं) या क्यू) और (पी या आर)' – onedaywhen
If @LstTransDt is Null
begin
Set @OpenQty=0
end
else
begin
Select @OpenQty=IsNull(Sum(ClosingQty),0)
From ProductAndDepotWiseMonitoring
Where [email protected] And [email protected] And [email protected]
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
यह प्रासंगिक प्रतीत नहीं होता है। यह WHERE खंड में एक आईएफ (या कोई सशर्त कोड) का उपयोग नहीं करता है। –
निम्न उदाहरण बूलियन अभिव्यक्ति के हिस्से के रूप एक प्रश्न निष्पादित करता है और उसके बाद थोड़ा अलग बयान बूलियन अभिव्यक्ति का परिणाम के आधार पर ब्लॉक निष्पादित करता है।प्रत्येक कथन ब्लॉक 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
यह प्रासंगिक प्रतीत नहीं होता है। यह WHERE खंड में एक आईएफ (या कोई सशर्त कोड) का उपयोग नहीं करता है। –
आपको एक आईएफ कथन की आवश्यकता नहीं है।
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
मुझे वास्तव में यह दृष्टिकोण पसंद है। Alternativ उपयोग करता है: केवल फ़िल्टर कर AdmUseId एक मूल्य है: 'जहां (@AdmUserId रिक्त है या CurrentOrder.CustomerAdmUserId = @AdmUserId)' या केवल फ़िल्टर कर IncludeDeleted = 0: 'जहां (@IncludeDeleted = 1 या ItemObject.DeletedFlag = 0) ' –
[लेखक द्वारा अद्यतन के बाद नोट]: यह काम करना चाहिए, लेकिन आपको यह सुनिश्चित करने के लिए दोनों पक्षों को टीआरआईएम() चाहिए कि एक मैच मिल जाए। मुझे आंत महसूस हो रहा है कि अभी भी दुर्लभ मामले हैं जो मैच में असफल हो जाते हैं। –
'केस' का उपयोग करना ज्यादातर मामलों में उचित समाधान है। मेरे मामले में, मैं तुलना ऑपरेटर को बदलना चाहता था और इसलिए मैंने अगले दृष्टिकोण का उपयोग किया। – Birla