Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да подобря този оператор SELECT за пощенски адрес на SQL Server?

Начинът да направите това е с UNPIVOT. Ето решението:

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

Ето изхода:

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

Обърнете внимание, че трябваше да използвам "Varchar(102)" като дължина на полето (unpivot изисква всички полета да са еднакви), защото вашият град/регион/поща може да има общо до 102 знака. Също така имайте предвид, че "@UniqueID" е идентификаторът за записа, чийто адрес ви трябва. Това връща четири и винаги четири реда съдържащ данните, от които се нуждаете за вашия адрес.

АКТУАЛИЗАЦИЯ: Ако трябва да върнете това като набор от четири колони вместо четири реда, след това просто го вмъкнете в изглед и след това заявете изгледа с Pivot . Включих изгледа тук за пълнота, тъй като трябваше да променя малко горното, когато създавах изгледа, така че полето uniqueID да беше включено и да не беше извършено сортиране (сортирането вече се извършва в заявката):

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 

И след това, когато искате да извадите съвпадащия си „ред“, завъртете го обратно, като използвате този SQL (забележете, че правя заявка отново, използвайки 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

Това връща:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите експортиран изход в реален CSV формат в SQL Server Management Studio?

  2. не може да се отвори, защото е версия 706. Този сървър поддържа версия 662 и по-стари. Пътят на понижаване не се поддържа

  3. SQL заявка за съвпадение на ключови думи?

  4. Защо моето ляво присъединяване на t-sql не работи?

  5. Какво е новото в SQL Server 2019?