كيف يمكنني إجراء IF...ثم في SQL SELECT؟
-
09-06-2019 - |
سؤال
كيف أقوم بإجراء 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) معهد التمويل الدولي البيان الذي هو متاح أيضا في وصول (أشار إليه مارتن سميث):
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
وظيفة لهذا.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
هذه في الواقع مجرد طريقة مختصرة (وإن لم تكن SQL قياسية) للكتابة CASE
.
أنا أفضل الإيجاز بالمقارنة مع الموسعة CASE
إصدار.
كلاهما IIF()
و CASE
يتم حلها كتعبيرات ضمن عبارة SQL ولا يمكن استخدامها إلا في أماكن محددة جيدًا.
لا يمكن استخدام تعبير الحالة للتحكم في تدفق تنفيذ عبارات المعاملات SQL ، وكتل العبارات ، والوظائف المعرفة من قبل المستخدم ، والإجراءات المخزنة.
إذا لم يكن من الممكن تلبية احتياجاتك من خلال هذه القيود (على سبيل المثال، الحاجة إلى إرجاع مجموعات نتائج ذات أشكال مختلفة تعتمد على بعض الشروط)، فإن SQL Server لديه أيضًا إجراء إجرائي 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, ، وأعتقد أن العبارة التي يمكنك استخدامها ستكون مثل هذا (من 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
مايكروسوفت 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
من هذا الرابط, يمكننا أن نفهم 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؟
عبارة if-else البسيطة في SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
عبارة If...else المتداخلة في SQL Server -
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
يرى عرض العمل:إذا ثم بدون case
في خادم SQL.
للبدء، تحتاج إلى معرفة قيمة true
و false
لشروط مختارة.هنا يأتي اثنان نوليف:
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 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 هي ميزة تمت إضافتها وتعمل كبديل لبيانات الحالة.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
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
في هذه الحالة - سيساعد في منع المشكلات.
يمكن أن يكون لديك خياران لتنفيذ ذلك فعليًا:
باستخدام IIF، الذي تم تقديمه من SQL Server 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
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product