it-swarm.asia

كيف يمكنني إجراء IF ... ثم في SQL SELECT؟

كيف أقوم بإجراء IF...THEN في عبارة SQL SELECT؟

فمثلا:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
1367
Eric Labashosky

عبارة 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
1601
Darrel Miller

بيان الحالة هو صديقك في هذه الحالة ، ويأخذ أحد الشكلين التاليين:

الحالة البسيطة:

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>

يمكنك حتى وضع بيانات الحالة في ترتيب بفقرة من أجل ترتيب خيالي حقًا.

306
Jonathan

من SQL Server 2012 ، يمكنك استخدام IIFfunction لهذا الغرض.

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 

يجب توخي الحذر أحيانًا لتجنب مشكلات استنشاق المعلمة مع هذا النهج.

245
Martin Smith

يمكنك العثور على بعض الأمثلة اللطيفة فيقوة بيانات SQL CASE، وأعتقد أن العبارة التي يمكنك استخدامها ستكون مثل هذا (من 4guysfromrolla ):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
83
sven

حالة الاستخدام. شيء من هذا القبيل.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
74
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
47
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
44
Santiago Cepas

من هذا 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؟

43
Ken

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
42
user7658

عبارة 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
30
Ravi Anand

استخدم عبارة CASE:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...
24
Christopher

تمت إضافة ميزة جديدة ، من (يمكننا ببساطة استخدامها) ، في SQL Server 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
24
sandeep rawat

استخدم منطق البت النقي:

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 الطريقة.

24
Tomasito
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' )
19
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
17
atik sarker
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
14
Chanukya

هذه ليست إجابة ، إنها مجرد مثال لبيان 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]
13
JustJohn

إذا كنت تقوم بإدخال النتائج في جدول لأول مرة ، بدلاً من نقل النتائج من جدول إلى آخر ، فهذا يعمل في 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');
12
Robert B. Grossman

كحل بديل لنهج جدول البيان 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
10
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
9
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
7
SURJEET SINGH Bisht

بالنسبة لأولئك الذين يستخدمون SQL Server 2012 ، فإن IIF هي ميزة تمت إضافتها وتعمل كبديل لبيانات Case.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
6
Dibin

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

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
3
user11127093

سؤال:

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 في هذه الحالة - في منع المشكلات.

2
David Cohn
SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product
1
gii96