web-development-kb-asia.site

Làm cách nào để tôi thực hiện IF ... THEN trong SQL SELECT?

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
1332
Eric Labashosky

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
1570
Darrel Miller

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.

301
Jonathan

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()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.

236
Martin Smith

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
81
sven

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
73
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
46
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43
Santiago Cepas

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?

41
Ken

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

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
29
Ravi Anand

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
23
sandeep rawat

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 truefalse 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.

23
Tomasito

Sử dụng câu lệnh CASE:

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

etc...
22
Christopher
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' )
18
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
15
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
13
Chanukya

Đâ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]
12
JustJohn

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');
11
Robert B. Grossman

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
9
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
8
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
6
SURJEET SINGH Bisht

Đố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 
5
Dibin

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

0
gii96

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
0
Shivi

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ố.

0
David Cohn