sql >> Base de Datos >  >> RDS >> Sqlserver

Extraiga el apellido, el nombre y el sufijo en columnas separadas

Realmente debería almacenar estas partes del nombre en columnas separadas (primera forma normal) para evitar tal análisis.

Puede poner toda la lógica en una gran llamada de funciones anidadas, pero es bastante útil separarlas en llamadas individuales usando CROSS APPLY .

El análisis es directo:

  • encontrar la posición de la coma
  • divida la cadena en partes antes de la coma (LastName ) y parte AfterComma
  • encontrar la posición del primer espacio en la segunda parte AfterComma
  • divida la cadena en dos partes de nuevo - esto da FirstName y el resto (AfterSpace )
  • encontrar la posición del espacio en AfterSpace
  • divida la cadena en dos partes de nuevo - esto da Initial y Suffix .

La consulta también comprueba los resultados de CHARINDEX - devuelve 0 si no se encuentra la cadena.

Obviamente, si el valor de la cadena no tiene el formato esperado, obtendrá un resultado incorrecto.

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

resultado

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