ฉันจะทำ IF …แล้วใน SQL SELECT ได้อย่างไร


1508

ฉันจะดำเนินการIF...THENในSQL SELECTคำสั่งได้อย่างไร

ตัวอย่างเช่น:

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

14
คุณอาจต้องการดูลิงค์นี้ เกี่ยวกับ: SQL WHERE clause: หลีกเลี่ยง CASE, ใช้ตรรกะบูลีน
บางคน

3
@Somebody: ไม่เกี่ยวข้องจริงๆเพราะบทความพูดถึงการใช้กฎการเขียนเชิงตรรกะเพื่อแปลงความหมายเป็นความแตกแยก เบาะแสคือคำว่า 'ตรรกะ' คือสิ่งที่แก้ไขเป็นจริงหรือเท็จซึ่งไม่มีผลกับการฉายภาพ TL; DR บทความนำไปใช้WHEREและแต่ไม่CHECK SELECT
onedaywhen

6
@ MartinSmith คำตอบนั้นสวยหรูที่สุด - ใช้ IIF ใน SQL 2012+
Murray Foxcroft

คำตอบ:


1760

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

57
คำเตือนเพิ่มเติมเพียงอย่างเดียวไม่ได้แนบเงื่อนไขของคุณไว้ในวงเล็บเมื่อใช้เคส เอาไม่น้อยของเวลาที่จะตระหนักว่า :)
อาจารย์ Mishra

17
และอย่าลืม END
Simon_Weaver

8
และเป็นบิต!
Cas Bloem

8
กรณี, เมื่อ, อื่นและสิ้นสุดควรเยื้องขนาน (ตามแนวเดียวกัน) - และเท่านั้นจากนั้นควรเยื้องต่อไปภายใน - ทำงานได้ดีที่สุดสำหรับฉัน
Ujjwal Singh

6
@ReeveStrife เฉพาะ iif SQL Server 2012+
stuartdotnet

327

คำสั่ง case เป็นเพื่อนของคุณในสถานการณ์นี้และใช้หนึ่งในสองรูปแบบ:

กรณีง่าย ๆ :

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>

คุณสามารถใส่คำสั่ง case โดยเรียงตามลำดับสำหรับการสั่งซื้อแฟนซี


32
ฉันรู้ว่ามันเก่า แต่ฉันคิดว่ามันควรจะสังเกตว่าคุณสามารถเพิ่มAS Col_NameหลังENDชื่อคอลัมน์ผลลัพธ์
Ben

9
ฉันมักจะรู้สึกเหมือนคนที่ 2 นั้นง่ายกว่า
โฮแกน

4
ตกลงฉันมักจะจบลงด้วยการใช้คำสั่งกรณีที่ขยายเพราะเงื่อนไขที่ฉันต้องการที่จะทดสอบมีความซับซ้อนมากกว่าตัวแปรเพียงตัวเดียว ฉันแค่อ่านมันง่ายขึ้น
magnum_pi

1
คำอธิบายที่ดีของทั้งสองสถานการณ์โดยมีหรือไม่มีตัวแปร ด้วยตัวแปรเงื่อนไขจำเป็นต้องตอบสนองความเท่าเทียมกันระหว่างตัวแปรหลังจากคำสั่ง case และที่คุณยึดกับเงื่อนไขของคุณโดยไม่มีตัวแปรคุณสามารถเพิ่มเงื่อนไขแบบพอเพียงเพื่อทดสอบ
Remus.A

ฉันสะดวกกว่าด้วยตัวเลือกที่สอง ทั้งสองมีความเท่าเทียมกัน
Stanley Okpala Nwosa

277

จาก SQL Server 2012 คุณสามารถใช้IIFฟังก์ชันนี้ได้

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

นี้เป็นอย่างมีประสิทธิภาพเพียงจดชวเลข (แม้จะไม่ได้มาตรฐาน SQL) CASEวิธีการเขียน

ฉันชอบความกระชับเมื่อเปรียบเทียบกับCASEเวอร์ชันที่ขยายเพิ่มเติม

ทั้งสองIIF()และCASEแก้ไขเป็นนิพจน์ภายในคำสั่ง SQL และสามารถใช้ได้เฉพาะในสถานที่ที่กำหนดไว้อย่างดีเท่านั้น

ไม่สามารถใช้นิพจน์ CASE เพื่อควบคุมการไหลของการดำเนินการของคำสั่ง Transact-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

บางครั้งต้องใช้ความระมัดระวังเพื่อหลีกเลี่ยงปัญหาการดมกลิ่นพารามิเตอร์ด้วยวิธีการนี้


6
นี่ควรเป็นคำตอบถ้าคุณต้องการคำสั่ง IF .. จากนั้นคำสั่งใน SQL
Mr.J

91

คุณสามารถหาตัวอย่างที่ดีในThe Power of SQL CASE Statementและฉันคิดว่าคำสั่งที่คุณสามารถใช้ได้จะเป็นแบบนี้ (จาก4guysfromrolla ):

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

4
ดู: meta.stackexchange.com/questions/103053/…สำหรับการสนทนาที่น่าสนใจ ฉันเป็นลิงก์สองรายการที่คุณให้จะเพิ่มบริบทเพิ่มเติมซึ่งฉันสนับสนุน
Sam Saffron

2
การอ้างอิงมีประโยชน์จริง ๆ และแนะนำเป็นอย่างยิ่งในกรณีที่มีรายละเอียดเพิ่มเติม
baymax



48

เซิร์ฟเวอร์ Microsoft 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

1
ทำไมคุณไม่ทำwhere Obsolete = 'N' or InStock = 'Y'และตัดครึ่งที่เป็นจริง
maksymiuk

46

จากลิงค์นี้เราสามารถเข้าใจ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 ใช่ไหม


3
นี่ไม่ใช่สิ่งที่ผู้ร้องขอต้องการ แต่มีประโยชน์มากที่จะรู้ว่าคุณสามารถใช้หากคำสั่งภายนอกคำสั่งที่เลือก
Jonathan

2
EXISTS นั้นดีเพราะมันจะหลุดออกจากลูปการค้นหาหากพบไอเท็ม COUNT ทำงานจนสิ้นสุดแถวของตาราง ไม่มีอะไรเกี่ยวข้องกับคำถาม แต่เป็นสิ่งที่ควรรู้
JustJohn


32

คำสั่ง 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

2
ล่าช้า แต่ใช้งานได้SELECTตาม OP ไหม?
abdul qayyum

25

มีการเพิ่มฟีเจอร์ใหม่IIF (ที่เราสามารถใช้งานได้) ใน SQL Server 2012:

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

1
คำตอบนี้ซ้ำ (โดยมีรายละเอียดน้อยลง) สิ่งที่มีอยู่ในคำตอบของ Martin Smith เมื่อหลายปีก่อน
jk7

1
@ jk7 นี่เป็นคำตอบแรกของคำถาม
sandeep rawat

3
ไม่ได้มาจากสิ่งที่ฉันเห็น มันบอกว่าคำตอบของคุณถูกโพสต์ 26 เมษายน '16 และมาร์ตินถูกโพสต์เมื่อ 20 กรกฎาคม 2011
jk7


23

ใช้ตรรกะบิตบริสุทธิ์:

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 Server

สำหรับการเริ่มต้นคุณต้องคำนวณมูลค่าtrueและfalseเงื่อนไขที่เลือก ที่นี่สองNULLIF มา :

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

รวมเข้าด้วยกันจะช่วยให้ 1 หรือ 0. การใช้งานต่อไปผู้ประกอบการระดับบิต

มันเป็นวิธีWYSIWYGที่สุด


19
-1 สำหรับ Code Obfuscation อย่างจริงจังนี่เป็นเรื่องไกลจาก WYSIWYG เท่าที่คุณจะได้รับ! ระเบียบที่ไม่สามารถอ่านได้แดงก่ำและถ้าฉันต้องทำงานกับรหัสของคุณฉันจะสาปแช่งตลอดทั้งวัน ... ขอโทษ: - /
Heliac

2
@Heliac ใส่ cte ไว้ในมุมมองแล้วคุณจะไม่เห็นความยุ่งเหยิง สำหรับยาวและซับซ้อนและ, หรือ, ไม่สามารถอ่านได้มากกว่า CASE (ส่วนนอกหลักสูตร cte)
Tomasito

1
ฉันได้รับ +1 นี้เพื่อความเรียบร้อยเมื่ออยู่ใน cte แต่โปรดทราบว่าปัจจุบันคำตอบนั้นไม่ถูกต้องสำหรับคำถาม คุณต้องมี '|' ไม่ใช่ '&'
Mark Hurd

3
เห็นด้วยอย่างยิ่งกับ @Heliac แม้ว่ามันจะถูกต้องทางไวยากรณ์และทำงานได้ดี แต่ก็ไม่สามารถรองรับได้อย่างง่ายดาย การวางไว้ใน CTE จะเป็นการย้ายส่วนของโค้ดที่อ่านไม่ได้ออกจากที่อื่น
objectNotFound

1
วิธีตารางในการตรวจสอบชุดค่าผสมอาจมีข้อดีของมัน การใช้ตัวแปรตารางและการรวมเข้ากับแบบสอบถามที่มีอยู่สามารถจัดเตรียมโซลูชันแบบอิงโดยไม่มีกรณีและปัญหา คำตอบนี้เป็นตัวอย่างที่ไม่ดี แต่ความคิดของตารางนั้นมีข้อดี
Suncat2000

19
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' )


14
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

2
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธีการตอบคำถามที่ถามได้อย่างไร
Guanxi

@Guanxi: แม้ว่าจะไม่ใช่คำตอบของฉัน 'กรณี' generalizes 'if-then-else' (จาก 2 กรณีเป็นจำนวนมาก)
JosephDoggie

คุณสามารถทำอย่างละเอียด?
Peter Mortensen

13

นี่ไม่ใช่คำตอบตัวอย่างของคำสั่ง 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]

1
การแก้ไขที่จัดรูปแบบคำสั่ง Case ใหม่ทั้งหมดนั้นดีและน่าสนใจและทำให้เข้าใจได้ง่ายขึ้น แต่ SQL จะยังคงจับตาดูในมุมมองที่ใช้อยู่
JustJohn

1
ฉันแค่หลงทำไมCASEกลายเป็น upvoted และทำเครื่องหมายเป็นคำตอบแทนที่จะได้IFที่ควรจะได้รับคำตอบเช่นนี้นี้ยังคงเป็นคำสั่งไม่ได้CASE IF
Mr.J

@ Mr.J: ไม่ใช่คำตอบของฉัน แต่ 'case' generalizes 'if-then-else' (จาก 2 กรณีเป็นจำนวนมาก)
JosephDoggie

12

หากคุณแทรกผลลัพธ์ลงในตารางเป็นครั้งแรกแทนที่จะถ่ายโอนผลลัพธ์จากตารางหนึ่งไปยังอีกตารางหนึ่งสิ่งนี้จะทำงานใน 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');

4
แท็กบอกว่า SQL Server, TSQL
Malachi

11

ในฐานะที่เป็นโซลูชันทางเลือกให้กับ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

ขายดีจะใช้ในที่ที่เงื่อนไขในแบบสอบถาม?
Bhavin Thummar

มันสามารถใช้ในสภาพที่
Serkan Arslan

9
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product

6

สำหรับผู้ที่ใช้ SQL Server 2012 IIF เป็นคุณสมบัติที่ได้รับการเพิ่มและทำงานเป็นทางเลือกแทนคำสั่ง Case

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

1
คำตอบนี้ซ้ำ (โดยมีรายละเอียดน้อยลง) สิ่งที่มีอยู่ในคำตอบของ Martin Smith เมื่อหลายปีก่อน
jk7

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

7
สวัสดี Surjeet ซิงห์ Bisht; รหัสของคุณอาจถูกต้อง แต่ด้วยบริบทบางอย่างมันจะทำให้คำตอบที่ดีกว่า; ตัวอย่างเช่นคุณสามารถอธิบายได้ว่าทำไมการเปลี่ยนแปลงที่เสนอนี้จะช่วยแก้ปัญหาของผู้ถามรวมถึงลิงค์ไปยังเอกสารที่เกี่ยวข้อง สิ่งนี้จะทำให้มีประโยชน์มากขึ้นสำหรับพวกเขาและยังเป็นประโยชน์ต่อผู้อ่านไซต์อื่น ๆ ที่กำลังมองหาวิธีแก้ไขปัญหาที่คล้ายกัน
Vince Bowdren

5
คำตอบนี้ไม่ได้เพิ่มอะไรใหม่ ในความเป็นจริงบรรทัดเดียวกันนี้ที่แน่นอนได้เป็นส่วนหนึ่งของคำตอบที่ได้รับการยอมรับมานานกว่า 5 ปี
SL Barth - Reinstate Monica

1
นอกจากนี้เป็นสิ่งสำคัญที่ต้องกล่าวถึงว่าIIFใช้เฉพาะกับ SQL Server ที่เริ่มต้นด้วย 2012
Ivan Rascon

5

คุณสามารถมีสองทางเลือกสำหรับสิ่งนี้เพื่อนำไปใช้จริง:

  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

4

คำถาม:

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ในกรณีนี้ - จะช่วยป้องกันปัญหา


3

การใช้ SQL CASE เป็นเหมือนคำสั่ง If / Else ปกติ ในแบบสอบถามด้านล่างหากค่าล้าสมัย = 'N' หรือถ้ามูลค่าในสต็อค = 'Y' จากนั้นเอาต์พุตจะเป็น 1 มิฉะนั้นเอาต์พุตจะเป็น 0 จากนั้นเราจะใส่ค่า 0 หรือ 1 ภายใต้คอลัมน์ขายดี

SELECT
      CASE 
        WHEN obsolete = 'N' OR InStock = 'Y' 
        THEN 1 
        ELSE 0 
      END AS Salable
      , * 
FROM PRODUCT

1
ฟังดูเข้าท่า. อาจจะใช้คำหรือสองคำเพื่ออธิบาย
JQSOFT

มันเป็นเหมือนคำสั่ง If / Else ปกติ ถ้า value ล้าสมัย = 'N' หรือถ้าค่า InStock = 'Y' แล้วผลลัพธ์จะเป็น 1 มิฉะนั้นเอาต์พุตจะเป็น 0
Tharuka

1
ขอบคุณ. โปรดแก้ไขโพสต์ของคุณเพื่อเพิ่มคำอธิบายนี้ If..Then...Else..SQL
ไลค์

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

8
จากรีวิว: ยินดีต้อนรับสู่ Stack Overflow! กรุณาอย่าตอบเพียงแค่มีซอร์สโค้ด พยายามให้คำอธิบายที่ดีเกี่ยวกับวิธีการทำงานของโซลูชัน ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร . ขอบคุณ
sɐunıɔןɐqɐp

3
ฉันคิดว่าคุณจะพบว่าสิ่งนี้ไม่ทำงานเนื่องจากไม่มีการแสดงผลใด ๆ หลังจากคำหลัก 'แล้ว'
Dodecaphone

คุณสามารถทำอย่างละเอียด?
Peter Mortensen

2

มันจะเป็นอย่างนั้น:

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;

เราสามารถใช้ค่า QuantityText ที่เงื่อนไขในแบบสอบถามได้หรือไม่? ตัวอย่างเช่น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';
Bhavin Thummar

1

เพื่อความสมบูรณ์ฉันจะเพิ่มว่า SQL ใช้ตรรกะสามค่า การแสดงออก:

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

เมื่อคุณทราบว่ามันทำงานอย่างไรคุณสามารถแปลงผลลัพธ์สามรายการเป็นผลลัพธ์สองรายการโดยตัดสินพฤติกรรมของ null เช่นนี้จะถือว่าเป็นโมฆะไม่ขายดี:

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           ELSE 'false' -- either false or null
       END AS saleable

0

ฉันชอบการใช้คำสั่ง CASE แต่คำถามที่ถามถึงคำสั่ง IF ใน SQL Select สิ่งที่ฉันเคยใช้ในอดีต:

SELECT

   if(GENDER = "M","Male","Female") as Gender

FROM ...

มันเหมือนกับคำสั่ง excel หรือแผ่น IF ที่มีเงื่อนไขตามด้วยเงื่อนไขจริงและจากนั้นเงื่อนไขเท็จ:

if(condition, true, false)

นอกจากนี้คุณสามารถซ้อนคำสั่ง if (แต่จากนั้นใช้ควรใช้ CASE :-)

(หมายเหตุ: ใช้งานได้ใน MySQLWorkbench แต่อาจไม่ทำงานในแพลตฟอร์มอื่น)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.