इस तरह के पार्सिंग से बचने के लिए आपको वास्तव में नाम के इन हिस्सों को अलग-अलग कॉलम (पहले सामान्य रूप) में स्टोर करना चाहिए।
आप सभी तर्कों को नेस्टेड फ़ंक्शंस की एक विशाल कॉल में डाल सकते हैं, लेकिन CROSS APPLY
का उपयोग करके उन्हें सिंगल कॉल में अलग करना काफी आसान है। ।
पार्सिंग सीधे आगे है:
- अल्पविराम की स्थिति ढूंढें
- अल्पविराम से पहले स्ट्रिंग को भाग में विभाजित करें (
LastName
) और भागAfterComma
- दूसरे भाग में पहले स्थान की स्थिति खोजें
AfterComma
- स्ट्रिंग को फिर से दो भागों में विभाजित करें - इससे
FirstName
मिलता है और बाकी (AfterSpace
) AfterSpace
में स्थान की स्थिति का पता लगाएं- स्ट्रिंग को फिर से दो भागों में विभाजित करें - यह
Initial
gives देता है और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