sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik deze SQL Server SELECT-instructie voor postadres verbeteren?

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                                                 


  1. mysql_connect():Er kon geen verbinding worden gemaakt omdat de doelmachine dit actief weigerde

  2. Zijn er in SQL / MySQL redenen om de één-op-één-relatie niet in dezelfde tabel te zetten?

  3. Kan MySQL Server 8.0.17 niet installeren met fout "De actie 'Installeren' voor product 'MySQL Server 8.0.17' is mislukt"

  4. Neem in PL/SQL een tabel als parameter, filter deze en retourneer deze