sql >> Database >  >> RDS >> Sqlserver

Extraheer achternaam, voornaam en achtervoegsel in afzonderlijke kolommen

U moet deze delen van de naam echt in aparte kolommen (eerste normaalvorm) opslaan om dergelijke ontleding te voorkomen.

Je kunt alle logica in één grote aanroep van geneste functies stoppen, maar het is best handig om ze te scheiden in afzonderlijke aanroepen met CROSS APPLY .

Het ontleden is eenvoudig:

  • vind positie van komma
  • splits de tekenreeks in delen vóór de komma (LastName ) en deel AfterComma
  • vind de positie van de eerste spatie in het tweede deel AfterComma
  • split de string opnieuw in twee delen - dit geeft FirstName en de rest (AfterSpace )
  • vind de positie van de spatie in AfterSpace
  • split de string opnieuw in twee delen - dit geeft Initial en Suffix .

De zoekopdracht controleert ook de resultaten van CHARINDEX - het geeft 0 terug als de string niet wordt gevonden.

Het is duidelijk dat als de tekenreekswaarde niet in het verwachte formaat is, je een onjuist resultaat krijgt.

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

resultaat

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. Wat is de beste manier om datum en tijd op te slaan in MySQL?

  2. Jokertekens in Java PreparedStatements

  3. MySQL-verbindingsvaliditeitstest in gegevensbron:SELECT 1 of iets beters?

  4. Cumulatieve som berekenen in PostgreSQL