Làm thế nào để tôi thực hiện một IF...THEN
trong một SQL SELECT
tuyên bố?
Ví dụ:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
và CHECK
không SELECT
.
Làm thế nào để tôi thực hiện một IF...THEN
trong một SQL SELECT
tuyên bố?
Ví dụ:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
và CHECK
không SELECT
.
Câu trả lời:
Câu CASE
lệnh gần nhất với IF trong SQL và được hỗ trợ trên tất cả các phiên bản của SQL Server.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Bạn chỉ cần làm CAST
nếu bạn muốn kết quả là giá trị Boolean. Nếu bạn hài lòng với một int
, điều này hoạt động:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
báo cáo có thể được nhúng trong các CASE
báo cáo khác và thậm chí bao gồm trong tổng hợp.
SQL Server Denali (SQL Server 2012) thêm câu lệnh IIF cũng có sẵn trong quyền truy cập (được chỉ ra bởi Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Tuyên bố trường hợp là bạn của bạn trong tình huống này và có một trong hai hình thức:
Trường hợp đơn giản:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Các trường hợp mở rộng:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Bạn thậm chí có thể đặt các báo cáo trường hợp theo một thứ tự theo mệnh đề cho thứ tự thực sự ưa thích.
AS Col_Name
sau khi END
đặt tên cột kết quả
Từ SQL Server 2012, bạn có thể sử dụng IIF
chức năng này.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Đây thực sự chỉ là một cách viết tốc ký (mặc dù không phải là SQL chuẩn) CASE
.
Tôi thích sự đồng nhất khi so sánh với CASE
phiên bản mở rộng .
Cả hai IIF()
và CASE
giải quyết dưới dạng các biểu thức trong một câu lệnh SQL và chỉ có thể được sử dụng ở những nơi được xác định rõ.
Biểu thức CASE không thể được sử dụng để kiểm soát luồng thực thi các câu lệnh Transact-SQL, khối câu lệnh, hàm do người dùng định nghĩa và các thủ tục được lưu trữ.
Nếu các nhu cầu của bạn không thể được thỏa mãn bởi những hạn chế này (ví dụ: nhu cầu trả về các tập kết quả có hình dạng khác nhau phụ thuộc vào một số điều kiện) thì SQL Server cũng có một IF
từ khóa thủ tục .
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Tuy nhiên, đôi khi phải cẩn thận để tránh các vấn đề đánh hơi thông số với phương pháp này .
Bạn có thể tìm thấy một số ví dụ hay trong Báo cáo Sức mạnh của SQL CASE và tôi nghĩ rằng tuyên bố mà bạn có thể sử dụng sẽ giống như thế này (từ 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Máy chủ Microsoft SQL (T-SQL)
Trong một select
, sử dụng:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Trong một where
mệnh đề, sử dụng:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
và cắt giảm một nửa thực tế
Từ liên kết này , chúng ta có thể hiểu IF THEN ELSE
trong 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'
Điều này không đủ tốt cho T-SQL?
Câu lệnh if-other đơn giản trong SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Nếu ... câu lệnh khác trong SQL Server - lồng nhau
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
như OP yêu cầu?
Một tính năng mới, IIF (mà chúng ta có thể sử dụng đơn giản), đã được thêm vào trong SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Sử dụng logic bit thuần túy:
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
Xem bản demo hoạt động: nếu sau đó không có case
trong SQL Server .
Để bắt đầu, bạn cần tính ra giá trị true
và false
cho các điều kiện đã chọn. Đây là hai NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
kết hợp với nhau cho 1 hoặc 0. Tiếp theo sử dụng toán tử bitwise .
Đó là phương pháp WYSIWYG nhất .
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
Đây không phải là một câu trả lời, chỉ là một ví dụ về câu lệnh CASE được sử dụng ở nơi tôi làm việc. Nó có một tuyên bố CASE lồng nhau. Bây giờ bạn biết tại sao mắt tôi bị lác.
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
trở nên lạc quan và được đánh dấu là một câu trả lời thay vì câu trả lời IF
nên là câu trả lời, như câu này, đây vẫn là một CASE
tuyên bố, không phải là một IF
.
Nếu bạn lần đầu tiên chèn kết quả vào một bảng, thay vì chuyển kết quả từ bảng này sang bảng khác, thì điều này hoạt động trong 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');
Là một giải pháp thay thế cho CASE
tuyên bố, một cách tiếp cận dựa trên bảng có thể được sử dụng:
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
Kết quả:
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
Đối với những người sử dụng SQL Server 2012, IIF là một tính năng đã được thêm vào và hoạt động như một giải pháp thay thế cho các câu lệnh 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
Bạn có thể có hai lựa chọn để thực hiện điều này:
Sử dụng IIF, được giới thiệu từ SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Sử dụng Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Câu hỏi:
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;
Sử dụng bí danh - p
trong trường hợp này - sẽ giúp ngăn chặn các vấn đề.
Sử dụng SQL CASE giống như các câu lệnh If / Else bình thường. Trong truy vấn bên dưới, Nếu giá trị lỗi thời = 'N' hoặc Nếu giá trị InStock = 'Y' thì Đầu ra sẽ là 1. Nếu không, đầu ra sẽ là 0. Sau đó, chúng tôi đặt giá trị 0 hoặc 1 đó dưới Cột có thể bán được.
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
Nó sẽ là một cái gì đó như thế:
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';
Để hoàn thiện, tôi sẽ thêm rằng SQL sử dụng logic ba giá trị. Cách diễn đạt:
obsolete = 'N' OR instock = 'Y'
Có thể tạo ra ba kết quả khác nhau:
| 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 |
Vì vậy, ví dụ nếu một sản phẩm đã lỗi thời nhưng bạn không biết sản phẩm đó có phải là instock hay không thì bạn không biết sản phẩm đó có bán được không. Bạn có thể viết logic ba giá trị này như sau:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Khi bạn tìm ra cách nó hoạt động, bạn có thể chuyển đổi ba kết quả thành hai kết quả bằng cách quyết định hành vi của null. Ví dụ, điều này sẽ coi null là không thể bán được:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Tôi thích việc sử dụng các câu lệnh CASE nhưng câu hỏi yêu cầu một câu lệnh IF trong SQL Chọn. Những gì tôi đã sử dụng trong quá khứ là:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Nó giống như các câu lệnh excel hoặc sheet IF trong đó có một điều kiện theo sau là điều kiện đúng và sau đó là điều kiện sai:
if(condition, true, false)
Hơn nữa, bạn có thể lồng các câu lệnh if (nhưng sau đó sử dụng nên sử dụng CASE :-)
(Lưu ý: điều này hoạt động trong MySQLWorkbench nhưng có thể không hoạt động trong các nền tảng khác)
Bạn có thể sử dụng Case Statement:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product