سؤال

كيف أقوم بإجراء 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 في هذه الحالة - سيساعد في منع المشكلات.

يمكن أن يكون لديك خياران لتنفيذ ذلك فعليًا:

  1. باستخدام IIF، الذي تم تقديمه من SQL Server 2012:

    SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
    
  2. استخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top