sql >> Databasteknik >  >> RDS >> Sqlserver

Extrahera efternamn, förnamn och suffix i separata kolumner

Du bör verkligen lagra dessa delar av namnet i separata kolumner (första normalformen) för att undvika sådan analys.

Du kan lägga all logik i ett stort anrop av kapslade funktioner, men det är ganska praktiskt att dela upp dem i enstaka anrop med CROSS APPLY .

Analysen är enkel:

  • hitta kommateckens position
  • dela strängen i en del före kommatecken (LastName ) och delen AfterComma
  • hitta positionen för första blanksteg i den andra delen AfterComma
  • delar strängen i två delar igen - detta ger FirstName och resten (AfterSpace )
  • hitta plats för utrymme i AfterSpace
  • delar strängen i två delar igen - detta ger Initial och Suffix .

Frågan kontrollerar också resultaten av CHARINDEX - den returnerar 0 om strängen inte hittas.

Uppenbarligen, om strängvärdet inte är i det förväntade formatet, får du ett felaktigt resultat.

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

resultat

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



  1. PHP/HTML Lägg till En borttagningsknapp

  2. MySQL-replikering med ProxySQL på WHM/cPanel-servrar:Del ett

  3. Objektet i klassen DateTime kunde inte konverteras till sträng

  4. Inner Join laravel 5.2