De manier om dit te doen is met een UNPIVOT. Hier is de oplossing:
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
Hier is de uitvoer:
Address1
Westby WI 55555
-empty line-
-empty line-
Houd er rekening mee dat ik "Varchar (102)" moest gebruiken als de veldlengte (voor unpivot moeten alle velden hetzelfde zijn) omdat uw stad/regio/post in totaal maximaal 102 tekens kan hebben. Houd er ook rekening mee dat "@UniqueID" de identificatie is voor de record waarvan u het adres nodig hebt. Dit geeft vier en altijd vier rijen met de gegevens die u nodig heeft voor uw adres.
UPDATE: Als u dit wilt retourneren als een set van vier kolommen in plaats van vier rijen, plaats het dan gewoon in een weergave en bevraag de weergave met een Pivot . Ik heb de weergave hier voor de volledigheid toegevoegd, omdat ik het bovenstaande een beetje moest veranderen bij het maken van de weergave, zodat het uniqueID-veld werd opgenomen en er geen sortering werd uitgevoerd (de sortering wordt nu gedaan in de query):
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
En als u vervolgens uw overeenkomende "rij" eruit wilt halen, draait u deze terug met behulp van deze SQL (merk op dat ik opnieuw vraag met 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
Dit geeft als resultaat:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667