Cách để làm điều này là với UNPIVOT. Đây là giải pháp:
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
Đây là kết quả:
Address1
Westby WI 55555
-empty line-
-empty line-
Lưu ý rằng tôi phải sử dụng "Varchar (102)" làm độ dài trường (bỏ chia yêu cầu tất cả các trường phải giống nhau) vì Thành phố / Vùng / Bưu điện của bạn có thể có tổng cộng 102 ký tự. Ngoài ra, hãy lưu ý rằng "@UniqueID" là định danh cho bản ghi có địa chỉ mà bạn cần. Điều này trả về bốn và luôn luôn bốn hàng chứa dữ liệu bạn cần cho địa chỉ của mình.
CẬP NHẬT: Nếu bạn cần trả lại giá trị này dưới dạng một tập hợp bốn cột thay vì bốn hàng, sau đó chỉ cần đặt nó vào một chế độ xem và sau đó truy vấn chế độ xem bằng Xoay vòng . Tôi đã bao gồm chế độ xem ở đây cho hoàn chỉnh vì tôi phải thay đổi ở trên chỉ một chút khi tạo chế độ xem để trường uniqueID được bao gồm và không có sắp xếp nào được thực hiện (việc sắp xếp hiện đã được thực hiện trong truy vấn):
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
Và sau đó, khi bạn muốn kéo "hàng" phù hợp của mình ra, hãy xoay nó trở lại bằng cách sử dụng SQL này (lưu ý rằng tôi đang truy vấn lại bằng 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
Điều này trả về:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667