Anda benar-benar harus menyimpan bagian nama ini di kolom terpisah (bentuk normal pertama) untuk menghindari penguraian seperti itu.
Anda dapat memasukkan semua logika ke dalam satu panggilan besar fungsi bersarang, tetapi cukup praktis untuk memisahkannya menjadi satu panggilan menggunakan CROSS APPLY
.
Penguraian langsung:
- cari posisi koma
- bagi string menjadi beberapa bagian sebelum koma (
LastName
) dan bagianAfterComma
- cari posisi spasi pertama di bagian kedua
AfterComma
- bagi string menjadi dua bagian lagi - ini memberikan
FirstName
dan sisanya (AfterSpace
) - temukan posisi spasi di
AfterSpace
- bagi string menjadi dua bagian lagi - ini memberikan
Initial
danSuffix
.
Kueri juga memeriksa hasil CHARINDEX
- mengembalikan 0 jika string tidak ditemukan.
Jelas, jika nilai string tidak dalam format yang diharapkan, Anda akan mendapatkan hasil yang salah.
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
hasil
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