sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg forbedre denne Mailing Address SQL Server SELECT-erklæring?

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                                                 


  1. SQLite DATEADD() Tilsvarende

  2. PostgreSQL pg_ctl-registreringsfejl under Windows 7

  3. SQL DELETE for begyndere

  4. Færdiggjort Java-projekt, nu oprettet jar- eller .exe-fil (med database)