كيف أقوم بإجراء IF...THEN
في عبارة SQL SELECT
؟
فمثلا:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
عبارة CASE
هي الأقرب إلى IF في SQL ويتم دعمها على جميع إصدارات SQL Server
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 Server Denali (SQL Server 2012) IIF عبارة وهو متاح أيضًا في وصول : (أشار بواسطة Martin Smith )
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>
يمكنك حتى وضع بيانات الحالة في ترتيب بفقرة من أجل ترتيب خيالي حقًا.
من SQL Server 2012 ، يمكنك استخدام IIF
function لهذا الغرض.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
هذا بشكل فعال مجرد وسيلة مختصرة (وإن لم تكن SQL قياسية) لكتابة CASE
.
أفضّل الإيجاز عند مقارنته بإصدار CASE
الموسّع.
يتم حل كل من IIF()
و CASE
كتعبيرات داخل عبارة SQL ويمكن استخدامها فقط في أماكن محددة جيدًا.
لا يمكن استخدام تعبير CASE للتحكم في تدفق تنفيذ عبارات SQL للعمليات وكتل العبارات والوظائف المعرفة من قبل المستخدم والإجراءات المخزنة.
إذا لم يكن بالإمكان تلبية احتياجاتك من خلال هذه القيود (على سبيل المثال ، الحاجة إلى إرجاع مجموعات النتائج بشكل مختلف حسب حالة معينة) ، فإن SQL Server لديها أيضًا إجرائية IF
Keyword.
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
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
من هذا link ، يمكننا التعرف على IF THEN ELSE
في T-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'
ليس هذا جيدا بما فيه الكفاية ل T-SQL؟
Microsoft SQL Server (T-SQL)
في استخدام حدد:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
في جملة أين ، استخدم:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
عبارة if-else بسيطة في SQL Server:
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
استخدم عبارة CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
تمت إضافة ميزة جديدة ، من (يمكننا ببساطة استخدامها) ، في 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
شاهد العرض التوضيحي للعمل: إذا كان ذلك دون حدوث أي مشكلة في MSSQL
للبدء ، تحتاج إلى تحديد قيمة true
و false
للظروف المحددة. هنا يأتي اثنين NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
مجتمعة يعطي 1 أو 0. الاستخدام التالي معاملات bitwise .
إنها الأكثر 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]
إذا كنت تقوم بإدخال النتائج في جدول لأول مرة ، بدلاً من نقل النتائج من جدول إلى آخر ، فهذا يعمل في Oracle 11.2g:
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
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
بالنسبة لأولئك الذين يستخدمون SQL Server 2012 ، فإن IIF هي ميزة تمت إضافتها وتعمل كبديل لبيانات Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
يمكن أن يكون لديك خياران لهذا التنفيذ الفعلي:
1) باستخدام IIF ، والذي تم تقديمه من SQL 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
2) عن طريق اختيار حالة:
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
في هذه الحالة - في منع المشكلات.
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product