Làm cách nào để tôi thực hiện IF...THEN
trong câu lệnh SQL SELECT
?
Ví dụ:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Câu lệnh CASE
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 thực hiện CAST
nếu bạn muốn kết quả là giá trị boolean, nếu bạn hài lòng với 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
Các câu lệnh CASE
có thể được nhúng trong các câu lệnh CASE
khác và thậm chí được bao gồm trong các tập hợp.
SQL Server Denali (SQL Server 2012) thêm câu lệnh IIF cũng có sẵn trong access : (đượ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.
Từ SQL Server 2012, bạn có thể sử dụng hàm IIF
cho việc 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 tiêu chuẩn) để viết CASE
.
Tôi thích sự đồng nhất khi so sánh với phiên bản CASE
mở rộng.
Cả IIF()
và CASE
đều giải quyết dưới dạng các biểu thức trong 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ủa 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à thủ tụ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 thủ tục 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
Đô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ụ thú vị trong Sức mạnh của các câu lệnh CASE SQL và tôi nghĩ rằng câu lệnh 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
Sử dụng TRƯỜNG HỢP. Một cái gì đó như thế này.
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
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?
Máy chủ Microsoft SQL (T-SQL)
Trong một lựa chọn sử dụng:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Trong mệnh đề where, sử dụng:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
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 máy chủ 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
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 KHÔNG CÓ TRƯỜNG HỢP TRONG MSSQL
Để bắt đầu, bạn cần tính ra giá trị của true
và false
cho các điều kiện đã chọn. Ở đây có 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. Sử dụng tiếp theo toán tử bitwise .
Đó là phương thức WYSIWYG nhất.
Sử dụng câu lệnh CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
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]
Nếu bạn đang chèn kết quả vào một bảng lần đầu tiên, 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 phương pháp tiếp cận theo bảng điều khiển CASE
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
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) 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
CHỌN CAST (TRƯỜNG HỢP KHI Lỗi thời = 'N' hoặc InStock = 'Y' THÌ ELSE 0 END AS bit) là Có thể bán được, * TỪ sản phẩm
Bạn có thể có hai lựa chọn để thực hiện điều này:
1) Sử dụng IIF, được giới thiệu từ SQL 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
2) Sử dụng Chọn trường hợp:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Câu hỏi ... CHỌN NẾU (Lỗi thời = 'N' OR InStock = 'Y'? 1: 0) NHƯ CÓ THỂ, * TỪ sản phẩm
ANSI: Chọn trường hợp khi p.Obsolete = 'N' hoặc p.InStock = 'Y' thì 1 khác 0 kết thúc là Salable, p. * TỪ Sản phẩm p;
Sử dụng bí danh - p trong trường hợp này - sẽ giúp ngăn ngừa sự cố.