2009-11-23 71 views
5

Tôi đang gặp sự cố khi sử dụng câu lệnh IF trong truy vấn sql-server này.sql-server, câu lệnh IF trong SQL Query

Những gì tôi muốn:

Nếu salesHeader.[Ship-to Name] không phải là null, tôi cần phải trả lại rằng AS DeliveryName, nếu nó là null, trở về cái gì khác.

Có cách nào để thực hiện việc này với tuyên bố if trong truy vấn không?

SELECT 
    poHeader.No_ AS PONumber, 
    poHeader.[Buy-from Vendor No_] AS VendorNumber, 
    poHeader.[Document Date] AS DocDate, 
    salesHeader.GiftMessage, 
    salesHeader.[Delivery Comment] AS DeliveryComment,      
    salesHeader.[Shipment Date] AS DeliveryDate, 
    IF salesHeader.[Ship-to Name] IS NOT NULL 
     salesHeader.[Ship-to Name] AS DeliveryName 
    ELSE 
     poHeader.[Ship-to Name] AS DeliveryName 
    END 
FROM   
    dbo.[Crocus Live$Purch_ orders for e-mailing] AS poForEmailing 
LEFT OUTER JOIN 
    dbo.[Crocus Live$Purchase Header] AS poHeader ON poForEmailing.No_ = poHeader.No_ 
INNER JOIN 
    dbo.[Crocus Live$Vendor] AS vendor ON poHeader.[Buy-from Vendor No_] = vendor.No_ 
LEFT OUTER JOIN 
    dbo.[Crocus Live$Sales Header] AS salesHeader ON salesHeader.No_ = dbo.fnGetSalesOrderNumber(poHeader.No_) 

Trả lời

9

Hoặc sử dụng liên hiệp ...

SELECT 
COALESCE(salesHeader.[Ship-to Name], poHeader.[Ship-to Name]) AS DeliveryName 

liên hiệp sẽ trả về giá trị phi NULL đầu tiên trong danh sách

11

Sử dụng CASE, không NẾU

CASE 
    WHEN salesHeader.[Ship-to Name] IS NOT NULL THEN salesHeader.[Ship-to Name] 
    ELSE poHeader.[Ship-to Name] 
END AS DeliveryName 

Edit:

Cả hai liên hiệp và ISNULL câu trả lời cho trong câu trả lời khác là giá trị ngang nhau quá đối với trường hợp đặc biệt này (và đơn giản, thẳng thắn)

1

Không chắc chắn, nhưng bạn không phải đặt 'AS DeliveryName' bên ngoài NẾU?

Ít nhất đó là cách nó hoạt động trong MySQL ...

5

Bạn có thể sử dụng CASE:

(CASE WHEN cond-1 THEN value-if-1 
     WHEN cond-2 THEN value-if-2 
     ELSE default-value END) AS column-name 

Hoặc trong trường hợp này, bạn có thể sử dụng COALESCE hoặc ISNULL:

COALESCE(salesHeader.[Ship-to Name], poHeader.[Ship-to Name]) AS DeliveryName 

ISNULL(salesHeader.[Ship-to Name], poHeader.[Ship-to Name]) AS DeliveryName 
2

Như những gì gbn đã nói, hãy sử dụng câu lệnh CASE để thay thế.

Vì anh ấy đã thực hiện mã hóa nên tôi không muốn đặt cùng một thứ nữa.

Thay vào đó chỉ đem lại cho bạn một số trang web để tham khảo cho sự hiểu biết của bạn

một) SQL SERVER – CASE Statement/Expression Examples and Explanation

b) CASE function in SQL Server 2005 - part I

c) CASE function in SQL Server 2005 - part II

d) CASE Function in SQL Server 2005 - part III

Các vấn đề liên quan