Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Estrai cognome, nome e suffisso in colonne separate

Dovresti davvero memorizzare queste parti del nome in colonne separate (prima forma normale) per evitare tale analisi.

Puoi mettere tutta la logica in un'unica enorme chiamata di funzioni nidificate, ma è abbastanza utile separarle in singole chiamate usando CROSS APPLY .

L'analisi è semplice:

  • trova la posizione della virgola
  • dividi la stringa in una parte prima della virgola (LastName ) e parte AfterComma
  • trova la posizione del primo spazio nella seconda parte AfterComma
  • dividi di nuovo la stringa in due parti:questo dà FirstName e il resto (AfterSpace )
  • trova la posizione dello spazio in AfterSpace
  • dividi di nuovo la stringa in due parti:questo dà Initial e Suffix .

La query controlla anche i risultati di CHARINDEX - restituisce 0 se la stringa non viene trovata.

Ovviamente, se il valore della stringa non è nel formato previsto, otterrai un risultato errato.

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

risultato

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