2009-11-23 13 views
5

Tengo problemas con el uso de una declaración IF en esta consulta sql-server.sql-server, instrucción IF dentro de SQL Query

lo que quiero:

Si salesHeader.[Ship-to Name] no es nulo, tengo que volver que AS DeliveryName, si es nulo, devuelve otra cosa.

¿Hay alguna manera de hacer esto con una declaración if en una consulta?

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

Respuesta

9

O usar COALESCE ...

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

COALESCE devolverá el primer valor no nulo en la lista

11

caso de uso, no se si

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

Editar:

Ambas respuestas unirse y isnull dan en otras respuestas son igualmente válidas también para este caso particular (y más simple, francamente)

1

No estoy seguro, pero ¿no tienes que poner 'AS DeliveryName' fuera de IF?

Al menos así es como funciona en MySQL ...

5

Puede Caso de uso:

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

o en este caso, se puede usar COALESCE o ISNULL:

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

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