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