Câu hỏi Làm thế nào để tôi thực hiện một IF ... THEN trong một SQL SELECT?


Làm cách nào để tôi thực hiện 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

1223
2017-09-15 14:34


gốc


Bạn có thể muốn xem xét điều này liên kết. Về: mệnh đề SQL WHERE: Tránh CASE, sử dụng logic Boolean - Somebody
@Somebody: không thực sự có liên quan bởi vì bài viết nói về việc sử dụng các quy tắc viết lại logic để chuyển đổi một hàm ý thành một sự tách rời. Các đầu mối là từ 'hợp lý' tức là một cái gì đó mà giải quyết thành sự thật hoặc sai, mà không áp dụng cho chiếu. TL; DR bài viết áp dụng cho WHERE và CHECK nhưng không SELECT. - onedaywhen
@ MartinSmith của câu trả lời là thanh lịch nhất - sử dụng IIF trong SQL 2012+. - Murray Foxcroft


Các câu trả lời:


Các CASE tuyên bố là 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ả dưới dạng giá trị boolean, nếu bạn hài lòng với int, những công việc này:

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

CASE các câu lệnh có thể được nhúng vào CASE báo cáo và thậm chí bao gồm trong tổng hợp.

SQL Server Denali (SQL Server 2012) thêm vào IIF tuyên bố cũng có sẵn trong truy cập: (được chỉ ra bởi Martin Smith)

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

1459
2017-09-15 14:38



Chỉ cần một lời cảnh báo bổ sung không kèm theo các điều kiện của bạn trong bộ đệm khi sử dụng vỏ máy. Mất khá nhiều thời gian để nhận ra điều đó :) - Archan Mishra
và đừng quên END - Simon_Weaver
và bit AS! - Cas Bloem
Trường hợp, khi nào, khác và cuối nên được thụt vào song song (cùng một dòng) - và chỉ sau đó nên thụt vào sâu hơn nữa - làm việc tốt nhất cho tôi. - Ujjwal Singh
@ReeveStrife Chỉ iif SQL Server 2012+ - stuartdotnet


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 dạng sau:

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>

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âu lệnh trường hợp theo thứ tự theo mệnh đề cho thứ tự thực sự ưa thích.


283
2017-09-15 15:10



Tôi biết đây là cũ, nhưng tôi nghĩ cần lưu ý rằng bạn có thể thêm AS Col_Name sau END để đặt tên cho cột kết quả - Ben
Tôi luôn cảm thấy như người thứ hai đơn giản hơn. - Hogan
Đồng ý, tôi hầu như luôn luôn kết thúc bằng cách sử dụng tuyên bố trường hợp mở rộng bởi vì các điều kiện tôi muốn kiểm tra trên luôn luôn phức tạp hơn chỉ là một biến chính nó. Tôi cũng cảm thấy dễ đọc hơn. - magnum_pi
Giải thích tốt về cả hai tình huống, có hoặc không có biến. Với biến điều kiện cần thỏa mãn sự bình đẳng giữa biến sau câu lệnh trường hợp và biến bạn căn cứ vào điều kiện của mình, không có biến bạn có thể thêm điều kiện tự đủ để kiểm tra. - Remus.A


Từ SQL Server 2012, bạn có thể sử dụng IIF chức năng cho điều này.

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

Đây là cách viết tắt hiệu quả (mặc dù không phải là tiêu chuẩn SQL) CASE.

Tôi thích sự đồng nhất khi so sánh với phần mở rộng CASE phiên bản.

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 ở các vị trí đượ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, các khối câu lệnh, các hàm do người dùng định nghĩa và   thủ tục lưu trữ.

Nếu 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ụ một nhu cầu trả về các bộ 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 Từ khóa.

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 việc chăm sóc phải được thực hiện để tránh các vấn đề đánh hơi thông số với cách tiếp cận này.


213
2017-07-20 23:39



Điều này sẽ là câu trả lời nếu bạn muốn một IF .. sau đó tuyên bố trong SQL. - Mr.J


Bạn có thể tìm thấy một số ví dụ hay trong Sức mạnh của câu lệnh SQL CASEvà tôi nghĩ rằng tuyên bố mà bạn có thể sử dụng sẽ là một cái gì đó như thế này (từ 4guysfromrolla):

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

74
2017-09-15 14:39



xem: meta.stackexchange.com/questions/103053/… cho một cuộc thảo luận thú vị. Tôi hai liên kết bạn cung cấp làm thêm ngữ cảnh bổ sung, mà tôi hỗ trợ. - Sam Saffron
Tham chiếu này thực sự hữu ích và được đề xuất cao trong trường hợp có thêm chi tiết - baymax


Sử dụng CASE. Một cái gì đó như thế này.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END

68
2017-09-15 14:37





SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

42
2017-09-15 14:37





 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

37
2017-09-15 14:37





Microsoft SQL Server (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

35
2017-09-15 14:40





Từ đây liên kếtchúng ta có thể uderstand 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 có đủ tốt cho T-SQL không?


34
2018-01-06 01:02



Đây không phải là những gì người yêu cầu muốn, nhưng rất hữu ích khi biết rằng bạn có thể sử dụng nếu câu lệnh ở ngoài một câu lệnh chọn. - Jonathan
EXISTS là tốt vì nó khởi động vòng lặp tìm kiếm nếu tìm thấy mục. COUNT chạy cho đến cuối hàng của bảng. Không có gì để làm với câu hỏi, nhưng một cái gì đó để biết. - JustJohn