ISNULL / COALESCE pour plusieurs champs

Considérez le model de données suivant:

Les clients

CustNum | First Name | Last Name 555 John Doe 

CustomerAddresses

 CustNum | ShippingAddress| Line1 | Line2 | City | State | Zip 555 | ADD1 | 333 A Dr. | Apt. 10 | Dallas | TX | 11345 555 | ADD2 | 111 B St. | NULL | Miami | FL | 22222 555 | WXYZ | 123 Main St. | NULL | Detroit | MI | 99998 

OrderHeader

 OrdNum | CustNum | OrderTotal | Line1 | Line2 | City | State| Zip 1000 | 555 | 67.00 | 123 Main St. | Ste 1 | Detroit | MI | 99998 

Ligne de command

 OrderNo | Item | Price | ShippingAddress 1000 | X123 | 32.00 | ADD1 1000 | Y234 | 25.00 | ADD2 1000 | ZZZZ | 10.00 | NULL 

Il existe une relation un-à-plusieurs entre les clients et CustomerAddresses.
Chaque OrderHeader, au lieu d'une relation key avec la table CustomerAddresses, stocke l'adresse utilisée pour l'expédition dans les champs Line1, Line2, City, State et Zip.
En outre, il est possible de sélectionner une adresse de livraison dans la table OrderLine qui remplace l'adresse stockée dans OrderHeader.
J'essaie de find une requête pour returnner datatables dans le format suivant, pour générer une list d'labels de publipostage:
MailingLabels

 OrderNo | Item | Line1 | Line2 | City | State | Zip 1000 | X123 | 333 A Dr. | Apt. 10 | Dallas | TX | 11345 1000 | Y234 | 111 B St. | NULL | Miami | FL | 22222 1000 | ZZZZ | 123 Main St. | NULL | Detroit | MI | 99998 

Fondamentalement, si l'logging OrderLine a une valeur ShippingAddress, je veux returnner l'adresse correspondante de la table CustomerAddresses.
Si elle est NULL, je souhaite renvoyer les valeurs Line1, Line2, City, State et Zip stockées dans la table OrderHeader.
Le problème est, quand j'utilise COALESCE ou ISNULL, il est possible de returnner des résultats incorrects. Voici ma requête:

 SELECT OH.OrderNo, Item, ISNULL(CA.Line1, OH.Line1), ISNULL(CA.Line2, OH.Line2), ISNULL(CA.City, OH.City), ISNULL(CA.State, OH.State), ISNULL(CA.Zip, OH.Zip) FROM OrderHeader OH JOIN OrderLine OL ON OH.OrderNo = OL.OrderNo LEFT JOIN CustomerAddress CA ON OL.CustNum = CA.CustNum AND OL.ShippingAddress = CA.ShippingAddress 

Avec la requête ci-dessus, si le champ Line2 est défini pour OrderHeader, mais que ShippingAddress est défini dans OrderLine, il est possible de renvoyer une adresse mixte pour l'article Y234:

 OrderNo | Item | Line1 | Line2 | City | State | Zip 1000 | Y234 | 111 B St. | Ste 1 | Miami | FL | 22222 

Notez que Ste 1 ne fait pas partie de l'adresse indiquée dans OrderLine, elle fait partie de OrderHeader.
Comment puis-je écrire une requête pour renvoyer datatables de la manière souhaitée? Toute aide est grandement appréciée!

Malheureusement, je ne peux pas penser à une manière ordonnée de faire ceci sans être tout à fait répétitif.

En supposant que les alias OL doivent avoir été CA :

 SELECT OH.OrderNo, Item, CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line1 ELSE CA.Line1 END, CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line2 ELSE CA.Line2 END, CASE WHEN OL.ShippingAddress IS NULL THEN OH.City ELSE CA.City END, CASE WHEN OL.ShippingAddress IS NULL THEN OH.State ELSE CA.State END, CASE WHEN OL.ShippingAddress IS NULL THEN OH.Zip ELSE CA.Zip END FROM OrderHeader OH JOIN OrderLine OL ON OH.OrderNo = OL.OrderNo LEFT JOIN CustomerAddress CA ON OL.CustNum = CA.CustNum AND OL.ShippingAddress = CA.ShippingAddress