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ầnAfterComma
- 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
Initial
vàSuffix
.
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