2009-11-23 130 views
5

我在这个sql-server查询中使用IF语句时遇到问题。sql-server,SQL查询中的IF语句

我想要什么:

如果salesHeader.[Ship-to Name]不为空,我需要返回,作为DeliveryName,如果为空,否则返回的东西。

有没有办法在查询中使用if语句来做到这一点?

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_) 

回答

9

或者使用COALESCE ...

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

COALESCE将返回列表中的第一个非NULL值

11

的使用情况,不IF

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

编辑:

两者结合并ISNULL答案给在其他的答案是同样有效过这种特殊情况下(和更简单的,坦率地说)

1

不确定,但是您是否必须将'AS DeliveryName'以外的作为IF?

至少,它是如何工作在MySQL的

5

你可以使用CASE:

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

或者在这种情况下您可以使用COALESCE或ISNULL:

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

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