Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę ulepszyć tę instrukcję SELECT w adresie pocztowym serwera SQL?

Sposobem na to jest UNPIVOT. Oto rozwiązanie:

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

Oto wynik:

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

Zauważ, że musiałem użyć „Varchar(102)” jako długości pola (unpivot wymaga, aby wszystkie pola były takie same), ponieważ Twoje miasto/region/poczta może mieć łącznie do 102 znaków. Pamiętaj też, że „@UniqueID” to identyfikator rekordu, którego adres potrzebujesz. Zwraca to cztery i zawsze cztery wiersze zawierające dane potrzebne do Twojego adresu.

AKTUALIZACJA: Jeśli musisz zwrócić to jako zestaw czterech kolumn zamiast czterech wierszy, a następnie po prostu umieść go w widoku, a następnie zapytaj widok za pomocą Pivota . Załączyłem tutaj widok dla kompletności, ponieważ musiałem nieco zmienić powyższe podczas tworzenia widoku, aby dołączono pole uniqueID i nie przeprowadzono sortowania (sortowanie jest teraz wykonywane w zapytaniu):

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 

A potem, kiedy chcesz wyciągnąć pasujący „wiersz”, przestaw go z powrotem za pomocą tego kodu SQL (zauważ, że ponownie wysyłam zapytanie za pomocą 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

To zwraca:

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. Dlaczego przedrostki oddzielone kropkami są ignorowane na liście kolumn dla instrukcji INSERT?

  2. Co to jest ograniczenie sprawdzające w SQL Server — samouczek SQL Server / TSQL — część 82

  3. Jak włączyć ograniczenie klucza obcego w programie SQL Server (przykłady T-SQL)

  4. Czy istnieje różnica między SQL Server Express (2012) a LocalDB?

  5. Podczas próby zapisania raportu SSRS pojawia się dziwny błąd