Pour ce faire, utilisez un UNPIVOT. Voici la solution :
With AddrTable as (
Select AddrFld, MailAddr From (
Select Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where [email protected]) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
Order By RN
Voici le résultat :
Address1
Westby WI 55555
-empty line-
-empty line-
Notez que j'ai dû utiliser "Varchar(102)" comme longueur de champ (unpivot exige que tous les champs soient identiques) car votre ville/région/poste peut avoir jusqu'à 102 caractères au total. Notez également que "@UniqueID" est l'identifiant de l'enregistrement dont vous avez besoin de l'adresse. Cela renvoie quatre et toujours quatre lignes contenant les données dont vous avez besoin pour votre adresse.
MISE À JOUR : Si vous devez renvoyer ceci sous la forme d'un ensemble de quatre colonnes au lieu de quatre lignes, placez-le simplement dans une vue, puis interrogez la vue avec un Pivot . J'ai inclus la vue ici pour être complet car j'ai dû modifier un peu ce qui précède lors de la création de la vue afin que le champ uniqueID soit inclus et qu'aucun tri n'ait été effectué (le tri est maintenant effectué dans la requête) :
Create View AddressRows AS
With AddrTable as (
Select UniqueID, AddrFld, MailAddr From (
Select UniqueID,
Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where [email protected]) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select UniqueID,
Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
Et puis, lorsque vous souhaitez extraire votre "ligne" correspondante, faites-la pivoter à l'aide de ce SQL (notez que j'interroge à nouveau en utilisant UniqueID):
Select [Addr1], [Addr2], [Addr3], [Addr4] From (
Select Top 4 'Addr' + Cast(Row_Number() over (Order by RN) as Varchar(12)) as AddrCol, -- "Top 4" needed so we can sneak the "Order By" in
MailAddr
From AddressRows Where [email protected]
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4])
) as pvt
Cela renvoie :
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667