full - sql management studio 2017



استخراج الاسم الأخير والاسم الأول واللاحقة في أعمدة منفصلة (1)

يجب عليك حقا تخزين هذه الأجزاء من الاسم في أعمدة منفصلة (النموذج العادي الأول) لتجنب مثل هذا التحليل.

يمكنك وضع كل المنطق في دعوة ضخمة واحدة من وظائف متداخلة، ولكن من المفيد جدا لفصلها في مكالمات واحدة باستخدام CROSS APPLY .

التحليل هو مباشرة إلى الأمام:

  • العثور على موقف الفاصلة
  • تقسيم السلسلة إلى جزء قبل فاصلة ( LastName ) وجزء AfterComma
  • العثور على موقف من الفضاء الأول في الجزء الثاني AfterComma
  • تقسيم السلسلة إلى جزأين مرة أخرى - وهذا يعطي AfterSpace والباقي ( AfterSpace )
  • العثور على موقف الفضاء في AfterSpace
  • تقسيم السلسلة إلى جزأين مرة أخرى - وهذا يعطي 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

https://ffff65535.com

كنت أتساءل عما إذا كان شخص ما يمكن أن توفر لي وسيلة سهلة لاستخراج الأسماء إلى أعمدة مختلفة على النحو التالي. هناك فاصلة بعد الاسم الأخير والمسافة بين الاسم الأول، الأوسط الأولي، واللاحقة. نقدر ذلك كثيرا.

بيانات مخزنه:

Name
Walker,James M JR
Smith,Jack P
Smith,Whitney

النتيجة المطلوبة:

LastName   FirstName   Suffix
Walker     James       JR
Smith      Jack
Smith      Whitney

رمز التجربة:

select top 5 Name,
LEFT(Name, CHARINDEX(',', Name) - 1) AS LastName,
right(Name, len(Name) - CHARINDEX(',', Name)) as FirstName

مجرد وجود مشكلة مع فصل الاسم الأول من الأوسط الأولي واللاحقة. ثم الحصول على لاحقة من المساحة الأخيرة من اليمين.





sql-server-2012