আমি কীভাবে 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 এর যে যদি নিকটস্থ হয় এবং 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
বিবৃতিগুলিতে এম্বেড করা যেতে পারে এবং সমষ্টিগুলিতেও অন্তর্ভুক্ত হতে পারে ।
এসকিউএল সার্ভার ডেনালি (এসকিউএল সার্ভার 2012) যোগ করে আইআইএফ স্টেটমেন্ট যুক্ত করে যা অ্যাক্সেসেও উপলব্ধ ( মার্টিন স্মিথ নির্দেশিত ):
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
এসকিউএল সার্ভার থেকে 2012 আপনি IIF
এটির জন্য ফাংশনটি ব্যবহার করতে পারেন ।
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
এই কার্যকরভাবে শুধু একটি সাঁটে লেখার (না আদর্শ SQL যদিও) লেখার উপায় CASE
।
প্রসারিত CASE
সংস্করণের সাথে তুলনা করার সময় আমি সংক্ষিপ্ততা পছন্দ করি ।
উভয়ই IIF()
এবং CASE
কোনও এসকিউএল স্টেটমেন্টের মধ্যেই এক্সপ্রেশন হিসাবে সমাধান করুন এবং কেবলমাত্র সংজ্ঞায়িত জায়গাগুলিতেই ব্যবহার করা যেতে পারে।
ট্রানজ্যাক্ট-এসকিউএল স্টেটমেন্টস, স্টেটমেন্ট ব্লক, ব্যবহারকারীর সংজ্ঞায়িত ফাংশন এবং সঞ্চিত পদ্ধতিগুলির কার্য সম্পাদনের প্রবাহ নিয়ন্ত্রণ করতে CASE এক্সপ্রেশন ব্যবহার করা যাবে না।
যদি আপনার প্রয়োজনীয়তা এই সীমাবদ্ধতা দ্বারা সন্তুষ্ট না করা যায় (উদাহরণস্বরূপ, কিছু শর্তের উপর নির্ভর করে ভিন্ন আকারের ফলাফলের সেটগুলি ফেরত নেওয়া দরকার) তবে এসকিউএল সার্ভারের একটি পদ্ধতিগত IF
কীওয়ার্ডও নেই।
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
তবে এই পদ্ধতির সাথে প্যারামিটার স্নিফিংয়ের সমস্যাগুলি এড়াতে কখনও কখনও যত্ন নেওয়া উচিত ।
এসকিউএল 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
মাইক্রোসফ্ট এসকিউএল সার্ভার (টি-এসকিউএল)
একটিতে 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 ELSE
টি-এসকিউএল বুঝতে পারি :
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
এসকিউএল সার্ভারে সহজ-অন্য বিবৃতি:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
নেস্টেড যদি ... এসকিউএল সার্ভারে অন্য বিবৃতি -
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
ওপি যেমন জিজ্ঞাসা করেছে তা কি ভিতরে ব্যবহারযোগ্য ?
এসকিউএল সার্ভার ২০১২- এ একটি নতুন বৈশিষ্ট্য, আইআইএফ (যা আমরা সহজভাবে ব্যবহার করতে পারি) যুক্ত করা হয়েছিল:
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
দেখুন : যদি এসকিউএল সার্ভার না করে থাকে ।
শুরু করার জন্য, আপনাকে নির্বাচিত শর্তগুলির মান true
এবং তার বাইরে কাজ করতে হবে false
। এখানে দুটি নূলিফ আসে :
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 বিবৃতি রয়েছে। আমার চোখ কেন পার হয়ে গেছে তা এখন আপনি জানেন।
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
upvoted এবং পরিবর্তে একটি উত্তর হিসাবে চিহ্নিত হয়ে IF
যা উত্তর হওয়া উচিত ছিল, এই এক মত, এই এখনও একটি হল CASE
বিবৃতি, কোনো IF
।
যদি আপনি প্রথমবারের জন্য কোনও টেবিলে ফলাফল অন্য টেবিলের কাছে স্থানান্তরিত না করে ফলাফলগুলি প্রথমবারের জন্য সন্নিবেশ করান তবে এটি ওরাকল 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
যারা এসকিউএল সার্ভার 2012 ব্যবহার করেন তাদের জন্য, আইআইএফ একটি বৈশিষ্ট্য যা যুক্ত করা হয়েছে এবং কেস স্টেটমেন্টের বিকল্প হিসাবে কাজ করে।
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
বাস্তবে বাস্তবায়নের জন্য আপনার কাছে দুটি পছন্দ থাকতে পারে:
আইআইএফ ব্যবহার করে, যা এসকিউএল সার্ভার ২০১২ থেকে প্রবর্তিত হয়েছে:
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
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
এলিয়াস ব্যবহার - p
এই ক্ষেত্রে - সমস্যাগুলি রোধ করতে সহায়তা করবে।
এসকিউএল CASE ব্যবহার করা ঠিক সাধারণ / অন্য বিবৃতিগুলির মতো। নীচের ক্যোয়ারিতে, যদি অপ্রচলিত মান = 'এন' বা যদি ইনস্টক মান = 'ওয়াই' থাকে তবে আউটপুটটি 1 হবে Otherwise অন্যথায় আউটপুট 0 হবে Then তারপরে আমরা 0 বা 1 মানটি বিক্রয়যোগ্য কলামের আওতায় রাখি।
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 বিবৃতি ব্যবহার করতে পছন্দ করি তবে প্রশ্নটি এসকিউএল সিলেক্টে আইএফ-এর বিবৃতি চেয়েছিল। আমি অতীতে যা ব্যবহার করেছি তা হ'ল:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
এটি যদি এক্সেল বা শিটস এর বিবৃতিগুলির মত হয় যেখানে শর্ত থাকে সত্য শর্ত এবং তারপরে মিথ্যা শর্ত অনুসরণ করে:
if(condition, true, false)
তদ্ব্যতীত, আপনি যদি নীড় নীড় করতে পারেন (তবে তারপরে ব্যবহারের একটি CASE ব্যবহার করা উচিত :-)
(দ্রষ্টব্য: এটি মাইএসকিউএল ওয়ার্কবেঞ্চে কাজ করে তবে অন্য প্ল্যাটফর্মগুলিতে কাজ নাও করতে পারে)
আপনি কেস স্টেটমেন্ট ব্যবহার করতে পারেন:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product