Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya dapat meningkatkan Pernyataan SELECT SQL Server Alamat Surat ini?

Cara melakukannya adalah dengan UNPIVOT. Ini solusinya:

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

Berikut outputnya:

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

Perhatikan bahwa saya harus menggunakan "Varchar(102)" sebagai panjang bidang (unpivot mengharuskan semua bidang harus sama) karena Kota/Wilayah/Pos Anda dapat memiliki total hingga 102 karakter. Juga, perhatikan bahwa "@UniqueID" adalah pengidentifikasi untuk catatan yang alamatnya Anda butuhkan. Ini mengembalikan empat dan selalu empat baris berisi data yang Anda butuhkan untuk alamat Anda.

PERBARUI: Jika Anda perlu mengembalikan ini sebagai satu set empat kolom daripada empat baris, lalu masukkan saja ke dalam tampilan dan kueri tampilan dengan Pivot . Saya telah menyertakan tampilan di sini untuk kelengkapan karena saya harus mengubah sedikit di atas saat membuat tampilan sehingga bidang uniqueID disertakan dan tidak ada pengurutan yang dilakukan (penyortiran sudah selesai dalam kueri):

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 

Dan kemudian, ketika Anda ingin menarik "baris" yang cocok, Pivot kembali menggunakan SQL ini (perhatikan bahwa saya menanyakan lagi menggunakan 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

Ini mengembalikan:

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. Cara Membuat Database di SQL Server Dengan Menggunakan TSQL atau GUI - Tutorial SQL Server / TSQL Part 24

  2. Secara Otomatis Jatuhkan dan Buat kembali indeks saat ini

  3. Cara Membuat Daftar Fitur Usang dalam Instance SQL Server menggunakan T-SQL

  4. Bagaimana cara menghapus karakter pertama dari kolom tertentu dalam tabel?

  5. Basis Data Sistem SQL Server – Pulihkan Basis Data Sistem