Opravdu byste měli tyto části jména uložit do samostatných sloupců (první normální forma), abyste se vyhnuli takové analýze.
Veškerou logiku můžete vložit do jednoho velkého volání vnořených funkcí, ale je docela užitečné je rozdělit do jednotlivých volání pomocí CROSS APPLY
.
Analýza je přímočará:
- najít pozici čárky
- rozdělte řetězec na část před čárkou (
LastName
) a částAfterComma
- najít pozici první mezery ve druhé části
AfterComma
- rozdělte řetězec znovu na dvě části – tím získáte
FirstName
a zbytek (AfterSpace
) - najít pozici mezery v
AfterSpace
- rozdělte řetězec znovu na dvě části – tím získáte
Initial
aSuffix
.
Dotaz také kontroluje výsledky CHARINDEX
- Pokud řetězec není nalezen, vrátí 0.
Je zřejmé, že pokud hodnota řetězce není v očekávaném formátu, dostanete nesprávný výsledek.
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
výsledek
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