Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để cải thiện Câu lệnh SQL Server SELECT trong địa chỉ gửi thư này?

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                                                 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NOLOCK (gợi ý Máy chủ Sql) có phải là phương pháp không tốt không?

  2. Truy vấn chuyển đổi Varchar HH:MM sang Phút số nguyên trong SQL Server 2008

  3. Thay thế cột nhận dạng từ int thành bigint

  4. So sánh ngày tháng trong T-SQL, bỏ qua phần thời gian

  5. .NET Core trên Azure không thể kết nối với Cơ sở dữ liệu SQL Server