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

Trích xuất họ, tên và hậu tố thành các cột riêng biệt

Bạn thực sự nên lưu trữ các phần này của tên trong các cột riêng biệt (dạng thông thường đầu tiên) để tránh phân tích cú pháp như vậy.

Bạn có thể đặt tất cả logic vào một lệnh gọi khổng lồ của các hàm lồng nhau, nhưng sẽ khá tiện lợi nếu tách chúng thành các lệnh đơn lẻ bằng cách sử dụng CROSS APPLY .

Quá trình phân tích cú pháp diễn ra đơn giản:

  • tìm vị trí của dấu phẩy
  • chia chuỗi thành một phần trước dấu phẩy (LastName ) và một phần AfterComma
  • tìm vị trí của khoảng trắng đầu tiên trong phần thứ hai AfterComma
  • chia chuỗi thành hai phần một lần nữa - điều này tạo ra FirstName và phần còn lại (AfterSpace )
  • tìm vị trí của khoảng trắng trong AfterSpace
  • chia chuỗi thành hai phần một lần nữa - điều này tạo ra InitialSuffix .

Truy vấn cũng kiểm tra kết quả của CHARINDEX - nó trả về 0 nếu không tìm thấy chuỗi.

Rõ ràng, nếu giá trị chuỗi không ở định dạng mong đợi, bạn sẽ nhận được kết quả không chính xác.

DECLARE @T TABLE (Name varchar(8000));
INSERT INTO @T (Name) VALUES
('Walker'),
('Walker,James M JR'),
('Smith,Jack P'),
('Smith,Whitney');

SELECT
    Name
    ,LastName
    ,AfterComma
    ,FirstName
    ,AfterSpace
    ,MidInitial
    ,Suffix
FROM
    @T
    CROSS APPLY (SELECT CHARINDEX(',', Name) AS CommaPosition) AS CA_CP
    CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
        LEFT(Name, CommaPosition - 1) ELSE Name END AS LastName) AS CA_LN
    CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
        SUBSTRING(Name, CommaPosition + 1, 8000) ELSE '' END AS AfterComma) AS CA_AC

    CROSS APPLY (SELECT CHARINDEX(' ', AfterComma) AS SpacePosition) AS CA_SP
    CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
        LEFT(AfterComma, SpacePosition - 1) ELSE AfterComma END AS FirstName) AS CA_FN
    CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
        SUBSTRING(AfterComma, SpacePosition + 1, 8000) ELSE '' END AS AfterSpace) AS CA_AS

    CROSS APPLY (SELECT CHARINDEX(' ', AfterSpace) AS Space2Position) AS CA_S2P
    CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
        LEFT(AfterSpace, Space2Position - 1) ELSE AfterSpace END AS MidInitial) AS CA_MI
    CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
        SUBSTRING(AfterSpace, Space2Position + 1, 8000) ELSE '' END AS Suffix) AS CA_S

kết quả

Name                 LastName    AfterComma    FirstName    AfterSpace  MidInitial  Suffix
Walker               Walker
Walker,James M JR    Walker      James M JR    James        M JR        M           JR
Smith,Jack P         Smith       Jack P        Jack         P           P
Smith,Whitney        Smith       Whitney       Whitney



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khắc phục sự cố Microsoft SQL Server Error 18456

  2. Thông tin xác thực cho dịch vụ SQL Server Agent không hợp lệ

  3. Coi cột là loại khác nhau để sắp xếp

  4. SET DATEFIRST - Đặt Ngày đầu tiên trong tuần trong SQL Server

  5. cách tăng giá trị cột số nguyên lên 1 trong SQL