Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je améliorer cette instruction SQL Server SELECT d'adresse postale ?

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