मैं IF...THENएक SQL SELECTबयान में कैसे प्रदर्शन कर सकता हूं ?
उदाहरण के लिए:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREऔर CHECKनहीं SELECT।
मैं IF...THENएक SQL SELECTबयान में कैसे प्रदर्शन कर सकता हूं ?
उदाहरण के लिए:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREऔर CHECKनहीं SELECT।
जवाबों:
CASEबयान एसक्यूएल में अगर के सबसे करीब है और SQL सर्वर के सभी संस्करणों पर समर्थित है।
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
CASTयदि आप परिणाम को बूलियन मान के रूप में चाहते हैं, तो आपको केवल करने की आवश्यकता है । यदि आप इससे खुश हैं int, तो यह काम करता है:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASEबयानों को अन्य CASEबयानों में एम्बेड किया जा सकता है और यहां तक कि समुच्चय में भी शामिल किया जा सकता है ।
SQL सर्वर Denali (SQL Server 2012) IIF स्टेटमेंट जोड़ता है जो एक्सेस में भी उपलब्ध है ( मार्टिन स्मिथ द्वारा इंगित ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
केस स्टेटमेंट इस स्थिति में आपका मित्र है, और दो रूपों में से एक लेता है:
साधारण मामला:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
विस्तारित मामला:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
तुम भी वास्तव में फैंसी आदेश के लिए खंड द्वारा एक आदेश में मामले के बयान डाल सकते हैं।
AS Col_Nameबाद एक जोड़ सकते हैंEND
SQL सर्वर 2012 से आप इसके लिए IIFफ़ंक्शन का उपयोग कर सकते हैं ।
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
यह प्रभावी रूप से सिर्फ एक आशुलिपि (यद्यपि मानक एसक्यूएल नहीं) लिखने का तरीका है CASE।
जब विस्तारित CASEसंस्करण के साथ तुलना की जाती है तो मैं संक्षिप्तता पसंद करता हूं ।
दोनों IIF()और CASEकिसी SQL कथन में अभिव्यक्ति के रूप में संकल्प और केवल अच्छी तरह से परिभाषित स्थानों में इस्तेमाल किया जा सकता।
CASE अभिव्यक्ति का उपयोग Transact-SQL स्टेटमेंट, स्टेटमेंट ब्लॉक, उपयोगकर्ता-परिभाषित फ़ंक्शन और संग्रहीत कार्यविधियों के निष्पादन के प्रवाह को नियंत्रित करने के लिए नहीं किया जा सकता है।
यदि आपकी आवश्यकताओं को इन सीमाओं से संतुष्ट नहीं किया जा सकता है (उदाहरण के लिए, किसी शर्त पर निर्भर अलग-अलग आकार के परिणाम सेट को वापस करने की आवश्यकता है) तो SQL सर्वर में एक प्रक्रियात्मक IFकीवर्ड भी होता है ।
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
हालाँकि इस दृष्टिकोण के साथ पैरामीटर सूँघने के मुद्दों से बचने के लिए कभी-कभी देखभाल की जानी चाहिए ।
आप पॉवर ऑफ़ SQL CASE स्टेटमेंट्स में कुछ अच्छे उदाहरण पा सकते हैं , और मुझे लगता है कि आप जिस स्टेटमेंट का उपयोग कर सकते हैं वह कुछ इस तरह से होगा ( 4guysfromrolla से ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
उदाहरण। कुछ इस तरह।
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
Microsoft SQL सर्वर (T-SQL)
एक में select, का उपयोग करें:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
एक whereक्लॉज में, उपयोग करें:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'और जहां व्यावहारिक रूप से आधे में कटौती करते हैं
से इस लिंक , हम समझ सकते IF THEN ELSET-SQL में:
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'ALFKI')
PRINT 'Need to update Customer Record ALFKI'
ELSE
PRINT 'Need to add Customer Record ALFKI'
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'LARSE')
PRINT 'Need to update Customer Record LARSE'
ELSE
PRINT 'Need to add Customer Record LARSE'
क्या यह टी-एसक्यूएल के लिए पर्याप्त नहीं है?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
SQL सर्वर में सरल-और स्टेटमेंट:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
नेस्टेड अगर ... SQL सर्वर में और विवरण -
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
PRINT 'what''s up?';
ELSE
PRINT 'Bye Ravi Anand.';
END;
GO
SELECTओपी ने पूछा कि यह अंदर से प्रयोग करने योग्य है
एक नई सुविधा, IIF (जिसका हम उपयोग कर सकते हैं), SQL Server 2012 में जोड़ा गया था:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
शुद्ध बिट तर्क का उपयोग करें:
DECLARE @Product TABLE (
id INT PRIMARY KEY IDENTITY NOT NULL
,Obsolote CHAR(1)
,Instock CHAR(1)
)
INSERT INTO @Product ([Obsolote], [Instock])
VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')
;
WITH cte
AS
(
SELECT
'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
,*
FROM
@Product AS p
)
SELECT
'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
,*
FROM
[cte] c
कार्यशील डेमोcase देखें : यदि SQL सर्वर में इसके बिना ।
शुरुआत के लिए, आपको चयनित स्थितियों के लिए trueऔर उसके मूल्य के लिए काम करना होगा false। यहाँ दो NULLIF आता है :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
एक साथ संयुक्त 1 या 0. आगे बिटवाइज़ ऑपरेटरों का उपयोग करता है ।
यह सबसे WYSIWYG विधि है।
SELECT 1 AS Saleable, *
FROM @Product
WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
FROM @Product
WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
case statement some what similar to if in SQL server
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
यह एक जवाब नहीं है, जहां मैं काम करता हूं, उपयोग के मामले में सिर्फ एक उदाहरण। इसका एक नेस्टेड CASE स्टेटमेंट है। अब तुम्हें पता है कि मेरी आँखें क्यों पार हो गई हैं।
CASE orweb2.dbo.Inventory.RegulatingAgencyName
WHEN 'Region 1'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 2'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 3'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'DEPT OF AGRICULTURE'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
ELSE (
CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
WHEN 1
THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
END
)
END AS [County Contact Name]
CASEउत्कीर्ण हो गया और एक उत्तर के रूप में चिह्नित किया गया IFजिसके बजाय उत्तर होना चाहिए था, जैसे यह एक है, यह अभी भी एक CASEबयान है, नहीं IF।
यदि आप पहली बार एक तालिका से दूसरी तालिका में परिणाम स्थानांतरित करने के बजाय, किसी तालिका में परिणाम सम्मिलित कर रहे हैं, तो यह Oracle 11.2% में काम करता है:
INSERT INTO customers (last_name, first_name, city)
SELECT 'Doe', 'John', 'Chicago' FROM dual
WHERE NOT EXISTS
(SELECT '1' from customers
where last_name = 'Doe'
and first_name = 'John'
and city = 'Chicago');
CASEबयान के वैकल्पिक समाधान के रूप में , टेबल-संचालित दृष्टिकोण का उपयोग किया जा सकता है:
DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')
SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM
@Product P
LEFT JOIN
( VALUES
( 'N', 'Y', 1 )
) Stmt (Obsolete, InStock, Saleable)
ON P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete
परिणाम:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
SQL सर्वर 2012 का उपयोग करने वालों के लिए, IIF एक विशेषता है जिसे जोड़ा गया है और केस स्टेटमेंट के विकल्प के रूप में काम करता है।
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
वास्तव में इसे लागू करने के लिए आपके पास दो विकल्प हो सकते हैं:
IIF का उपयोग करना, जो SQL सर्वर 2012 से शुरू किया गया है:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Productका उपयोग कर Select Case:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Productसवाल:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
एएनएसआई:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
उपनामों का उपयोग - pइस मामले में - मुद्दों को रोकने में मदद करेगा।
SQL CASE का उपयोग करना बिलकुल सामान्य है अगर / Else स्टेटमेंट्स की तरह। नीचे दिए गए प्रश्न में, यदि अप्रचलित मान = 'N' या यदि InStock मान = 'Y' तो आउटपुट 1 होगा। अन्यथा आउटपुट 0. होगा। फिर हमने उस 0 या 1 मान को Salable कॉलम के तहत रखा।
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
यह कुछ इस तरह होगा:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
पूर्णता के लिए, मैं जोड़ूंगा कि एसक्यूएल तीन-मूल्यवान तर्क का उपयोग करता है। भाव:
obsolete = 'N' OR instock = 'Y'
तीन अलग-अलग परिणाम दे सकते हैं:
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
इसलिए उदाहरण के लिए यदि कोई उत्पाद अप्रचलित है, लेकिन आप नहीं जानते कि यदि उत्पाद इंस्टॉक है तो आप नहीं जानते कि क्या उत्पाद बिक्री योग्य है। आप इस प्रकार के तीन मूल्यवान तर्क लिख सकते हैं:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
एक बार जब आप यह पता लगा लेते हैं कि यह कैसे काम करता है, तो आप अशक्त व्यवहार को तय करके तीन परिणामों को दो परिणामों में बदल सकते हैं। उदाहरण के लिए, यह इलाज योग्य नहीं होगा:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
मुझे CASE स्टेटमेंट्स का उपयोग पसंद है लेकिन SQL सेलेक्ट में IF स्टेटमेंट के लिए पूछा गया प्रश्न। मैंने अतीत में जो प्रयोग किया है वह है:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
यह एक्सेल या शीट्स की तरह है। यदि कथन में ऐसी कोई शर्त है जहां सही स्थिति और उसके बाद गलत स्थिति है:
if(condition, true, false)
इसके अलावा, यदि आप बयानों को घोंसला दे सकते हैं (लेकिन तब उपयोग का उपयोग करना चाहिए :-)
(नोट: यह MySQLWorkbench में काम करता है लेकिन अन्य प्लेटफार्मों में काम नहीं कर सकता है)
आप केस स्टेटमेंट का उपयोग कर सकते हैं:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product