sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag förbättra detta SQL Server SELECT-uttalande för postadresser?

Sättet att göra detta är med en UNPIVOT. Här är 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

Här är resultatet:

Address1
Westby WI  55555
-empty line-
-empty line-

Observera att jag var tvungen att använda "Varchar(102)" som fältlängd (unpivot kräver att alla fält är samma) eftersom din stad/region/post kan ha upp till 102 tecken totalt. Observera också att "@UniqueID" är identifieraren för posten vars adress du behöver. Detta returnerar fyra och alltid fyra rader som innehåller de uppgifter du behöver för din adress.

UPPDATERING: Om du behöver returnera detta som en uppsättning av fyra kolumner i stället för fyra rader, ploppa den bara in i en vy och fråga sedan vyn med en pivot . Jag har inkluderat vyn här för fullständighetens skull eftersom jag var tvungen att ändra ovanstående bara lite när jag skapade vyn så att det unika ID-fältet inkluderades och ingen sortering gjordes (sorteringen görs nu i frågan):

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 

Och sedan, när du vill dra ut din matchande "rad", pivoterar du tillbaka den med denna SQL (märk på att jag frågar igen med 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

Detta returnerar:

Addr1            Addr2                Addr3           Addr4
--------------   ------------------   -------------   ------------------ 
Address1         Westby WI  54667                                                 


  1. JQuery Datatable - Dela en cell i flera kolumner för läsbarhet?

  2. Välj kolumnvärde om inte null annars använd ett annat kolumnvärde

  3. Hur kan jag säkerställa att en materialiserad vy alltid är uppdaterad?

  4. Hur Sign()-funktionen fungerar i PostgreSQL