Måden at gøre dette på er med en UNPIVOT. Her er løsningen:
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
Her er outputtet:
Address1
Westby WI 55555
-empty line-
-empty line-
Bemærk, at jeg var nødt til at bruge "Varchar(102)" som feltlængden (unpivot kræver, at alle felter er ens), fordi din by/region/post kan have op til 102 tegn i alt. Bemærk også, at "@UniqueID" er identifikatoren for den post, hvis adresse du skal bruge. Dette returnerer fire og altid fire rækker indeholder de data, du har brug for til din adresse.
OPDATERING: Hvis du har brug for at returnere dette som et sæt af fire kolonner i stedet for fire rækker, så bare plop den ind i en visning og forespørg derefter visningen med en pivot . Jeg har inkluderet visningen her for fuldstændighedens skyld, da jeg var nødt til at ændre ovenstående en smule, da jeg oprettede visningen, så feltet unikt ID blev inkluderet, og ingen sortering blev udført (sorteringen er nu udført i forespørgslen):
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
Og så, når du vil trække din matchende "række" ud, drej den tilbage ved hjælp af denne SQL (bemærk, at jeg forespørger igen ved hjælp af 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
Dette returnerer:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667