このような解析を避けるために、名前のこれらの部分を別々の列 (第 1 正規形) に格納する必要があります。
すべてのロジックをネストされた関数の 1 つの巨大な呼び出しに入れることができますが、CROSS APPLY
を使用してそれらを単一の呼び出しに分割すると非常に便利です。 .
解析は簡単です:
- コンマの位置を見つける
- 文字列をコンマの前の部分に分割します (
LastName
) とAfterComma
の部分 - 2 番目の部分の最初のスペースの位置を見つける
AfterComma
- 文字列を再度 2 つの部分に分割します。これにより、
FirstName
が得られます。 そして残り (AfterSpace
) AfterSpace
でスペースの位置を見つける- 文字列を再び 2 つの部分に分割します - これにより
Initial
が得られます およびSuffix
.
クエリは CHARINDEX
の結果もチェックします - 文字列が見つからない場合は 0 を返します。
明らかに、文字列値が期待される形式でない場合、間違った結果が得られます。
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
結果
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