ฉันจะดำเนินการIF...THEN
ในSQL SELECT
คำสั่งได้อย่างไร
ตัวอย่างเช่น:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
และแต่ไม่CHECK
SELECT
ฉันจะดำเนินการIF...THEN
ในSQL SELECT
คำสั่งได้อย่างไร
ตัวอย่างเช่น:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
และแต่ไม่CHECK
SELECT
คำตอบ:
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
คำสั่ง 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 โดยเรียงตามลำดับสำหรับการสั่งซื้อแฟนซี
AS Col_Name
หลังEND
ชื่อคอลัมน์ผลลัพธ์
จาก 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
บางครั้งต้องใช้ความระมัดระวังเพื่อหลีกเลี่ยงปัญหาการดมกลิ่นพารามิเตอร์ด้วยวิธีการนี้
คุณสามารถหาตัวอย่างที่ดีใน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
ใช้ CASE บางสิ่งเช่นนี้
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
เซิร์ฟเวอร์ 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
where Obsolete = 'N' or InStock = 'Y'
และตัดครึ่งที่เป็นจริง
จากลิงค์นี้เราสามารถเข้าใจ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 ใช่ไหม
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
คำสั่ง 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
SELECT
ตาม OP ไหม?
มีการเพิ่มฟีเจอร์ใหม่IIF (ที่เราสามารถใช้งานได้) ใน SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
ใช้คำสั่ง CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
ใช้ตรรกะบิตบริสุทธิ์:
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ที่สุด
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]
CASE
กลายเป็น upvoted และทำเครื่องหมายเป็นคำตอบแทนที่จะได้IF
ที่ควรจะได้รับคำตอบเช่นนี้นี้ยังคงเป็นคำสั่งไม่ได้CASE
IF
หากคุณแทรกผลลัพธ์ลงในตารางเป็นครั้งแรกแทนที่จะถ่ายโอนผลลัพธ์จากตารางหนึ่งไปยังอีกตารางหนึ่งสิ่งนี้จะทำงานใน 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
สำหรับผู้ที่ใช้ SQL Server 2012 IIF เป็นคุณสมบัติที่ได้รับการเพิ่มและทำงานเป็นทางเลือกแทนคำสั่ง Case
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
คุณสามารถมีสองทางเลือกสำหรับสิ่งนี้เพื่อนำไปใช้จริง:
ใช้ 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 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
ในกรณีนี้ - จะช่วยป้องกันปัญหา
การใช้ 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
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
มันจะเป็นอย่างนั้น:
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;
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';
เพื่อความสมบูรณ์ฉันจะเพิ่มว่า 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
ฉันชอบการใช้คำสั่ง CASE แต่คำถามที่ถามถึงคำสั่ง IF ใน SQL Select สิ่งที่ฉันเคยใช้ในอดีต:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
มันเหมือนกับคำสั่ง excel หรือแผ่น IF ที่มีเงื่อนไขตามด้วยเงื่อนไขจริงและจากนั้นเงื่อนไขเท็จ:
if(condition, true, false)
นอกจากนี้คุณสามารถซ้อนคำสั่ง if (แต่จากนั้นใช้ควรใช้ CASE :-)
(หมายเหตุ: ใช้งานได้ใน MySQLWorkbench แต่อาจไม่ทำงานในแพลตฟอร์มอื่น)
คุณสามารถใช้คำสั่งกรณี:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product