none
Cortar Apellido RRS feed

  • Pregunta

  • Hola que tal estoy tratando de separar los apellidos de un registro el detalle esta asi:

    DE LA TORRE GONZALEZ, RAMIRO ALEJANDRO

    Quiero separar "DE LA TORRE" y "GONZALEZ"

    Pero hay apellidos que son de esta manera 

    GARCIA RINCON, JORGE ALEJANDRO 

    esos si los puedo separar el detalle esta en los que tiene el primer apellido con doble espacio porque me lo hace de esta forma

    "DE" y "LA TORRE GONZALEZ"

    Gracias, espero y me puedan ayudar

    jueves, 5 de septiembre de 2019 21:21

Respuestas

  • Hola Jorge Arrieta:

    Existen muchas posibilidades para poder separar caracteres, pero es importante saber de que versión de SQL Server dispones.

    Una posible solución, que no he validado, (tendrás que verificar si es válida para tu causística), puede ser así.

    CREATE TABLE apellidos
    (ID          INT, 
     NOMCOMPLETO VARCHAR(100)
    );
    GO
    INSERT INTO apellidos
    (ID, 
     NOMCOMPLETO
    )
    VALUES
    (1, 
     'DE LA TORRE GONZALEZ, RAMIRO ALEJANDRO'
    );
    GO
    INSERT INTO apellidos
    (id, 
     nomcompleto
    )
    VALUES
    (2, 
     'GARCIA RINCON, JORGE ALEJANDRO '
    );
    GO

    Una propuesta simple

    SELECT REVERSE(SUBSTRING(REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)))))) AS Apellido2, 
           REPLACE((SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', a.nomcompleto) - 1)), REVERSE(SUBSTRING(REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)))))), '') AS Apellido1
    FROM APELLIDOS A;

    Se trata de darle la vuelta a los apellidos, y buscar el espacio, separando el segundo apellido, y luego reemplazando en la cadena de los apellidos, esta separación.

    Recuerda que si no te vale, es necesario saber de que versión de SQL Server dispones. (Select @@versión)


    • Marcado como respuesta Jorge Arrieta lunes, 9 de septiembre de 2019 14:46
    jueves, 5 de septiembre de 2019 22:04

Todas las respuestas

  • Hola   Jorge Arrieta

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comparto a continuación los siguientes enlace

    https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    • Marcado como respuesta Jorge Arrieta lunes, 9 de septiembre de 2019 14:46
    • Desmarcado como respuesta Jorge Arrieta lunes, 9 de septiembre de 2019 14:46
    jueves, 5 de septiembre de 2019 21:58
    Moderador
  • Hola Jorge Arrieta:

    Existen muchas posibilidades para poder separar caracteres, pero es importante saber de que versión de SQL Server dispones.

    Una posible solución, que no he validado, (tendrás que verificar si es válida para tu causística), puede ser así.

    CREATE TABLE apellidos
    (ID          INT, 
     NOMCOMPLETO VARCHAR(100)
    );
    GO
    INSERT INTO apellidos
    (ID, 
     NOMCOMPLETO
    )
    VALUES
    (1, 
     'DE LA TORRE GONZALEZ, RAMIRO ALEJANDRO'
    );
    GO
    INSERT INTO apellidos
    (id, 
     nomcompleto
    )
    VALUES
    (2, 
     'GARCIA RINCON, JORGE ALEJANDRO '
    );
    GO

    Una propuesta simple

    SELECT REVERSE(SUBSTRING(REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)))))) AS Apellido2, 
           REPLACE((SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', a.nomcompleto) - 1)), REVERSE(SUBSTRING(REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(A.NOMCOMPLETO, 1, CHARINDEX(',', A.NOMCOMPLETO) - 1)))))), '') AS Apellido1
    FROM APELLIDOS A;

    Se trata de darle la vuelta a los apellidos, y buscar el espacio, separando el segundo apellido, y luego reemplazando en la cadena de los apellidos, esta separación.

    Recuerda que si no te vale, es necesario saber de que versión de SQL Server dispones. (Select @@versión)


    • Marcado como respuesta Jorge Arrieta lunes, 9 de septiembre de 2019 14:46
    jueves, 5 de septiembre de 2019 22:04
  • Hola Javi, la version que estoy utilizando es la 2005
    jueves, 5 de septiembre de 2019 22:20
  • Hola José:

    Gracias. Tienes toda la razón con que ha quedado muy complicada.

    Yo había pensado, si era válida y funcional para el solicitante, luego hacer algo del estilo, para que quedase bien.

    Crear un función

    CREATE FUNCTION fn_SeparaApellidos
    (@apellidos NVARCHAR(MAX)
    )
    RETURNS TABLE
         RETURN
         SELECT REVERSE(SUBSTRING(REVERSE(SUBSTRING(@apellidos, 1, CHARINDEX(',', @apellidos) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(@apellidos, 1, CHARINDEX(',', @apellidos) - 1)))))) AS Apellido2, 
                REPLACE((SUBSTRING(@apellidos, 1, CHARINDEX(',', @apellidos) - 1)), REVERSE(SUBSTRING(REVERSE(SUBSTRING(@apellidos, 1, CHARINDEX(',', @apellidos) - 1)), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(@apellidos, 1, CHARINDEX(',', @apellidos) - 1)))))), '') AS Apellido1;

    Y luego invocarla.

    SELECT v.apellido1, v.apellido2 FROM
    apellidos A
    CROSS APPLY fn_separaApellidos(A.NOMCOMPLETO) v

    Lo cual no implica que con tú código, queda mucho más claro y entendible.


    viernes, 6 de septiembre de 2019 6:24
  • Hola Jorge Arrieta:

    Para 2005, cualquier cosa que se haga es artesana.

    ¿Has probado el código?

    Cuando lo hayas hecho, comenta.

    viernes, 6 de septiembre de 2019 6:25
  • Hola:

    Le he dado una vuelta más, para proteger, que el campo no tenga una coma para separar nombre de apellidos.

    ALTER FUNCTION fn_SeparaApellidos
    (@apellidos NVARCHAR(MAX)
    )
    RETURNS TABLE
         RETURN
         SELECT REVERSE(SUBSTRING(REVERSE(SUBSTRING(@apellidos, 1, (CASE
                                                    WHEN CHARINDEX(',', @apellidos) = 0
                                                    THEN LEN(@apellidos)
                                                    ELSE(CHARINDEX(',', @apellidos) - 1)
                                                END))), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(@apellidos, 1, (CASE
                                                    WHEN CHARINDEX(',', @apellidos) = 0
                                                    THEN LEN(@apellidos)
                                                    ELSE(CHARINDEX(',', @apellidos) - 1)
                                                END))))))) AS Apellido2, 
                REPLACE((SUBSTRING(@apellidos, 1, (CASE
                                                    WHEN CHARINDEX(',', @apellidos) = 0
                                                    THEN LEN(@apellidos)
                                                    ELSE(CHARINDEX(',', @apellidos) - 1)
                                                END))), REVERSE(SUBSTRING(REVERSE(SUBSTRING(@apellidos, 1, (CASE
                                                    WHEN CHARINDEX(',', @apellidos) = 0
                                                    THEN LEN(@apellidos)
                                                    ELSE(CHARINDEX(',', @apellidos) - 1)
                                                END))), 1, CHARINDEX(' ', (REVERSE(SUBSTRING(@apellidos, 1, 
    								    (CASE
                                                    WHEN CHARINDEX(',', @apellidos) = 0
                                                    THEN LEN(@apellidos)
                                                    ELSE(CHARINDEX(',', @apellidos) - 1)
                                                END))))))), '') AS Apellido1;

    Inserto unos registros más de prueba

    insert into apellidos(
    ID, NOMCOMPLETO)
    values
    (3,'APELLIDO'),
    (4,NULL),
    (5,'BBBB DDD'),
    (6,'RUIZ VELARDE DE LAS HERAS, JUAN ANTONIA');
    
    /* consumo la función */
    
    SELECT 
    v.*
    FROM apellidos AS A
    cross apply fn_separaApellidos (A.NOMCOMPLETO) v

    Salida


    viernes, 6 de septiembre de 2019 7:23
  • Y la misma función, aplicando la solución de José Diz, y evitando la ausencia de dos apellidos, y de la coma como separador de nombre y apellidos.

    CREATE FUNCTION fn_SeparaApellidos2(@apellidos NVARCHAR(MAX))
    RETURNS TABLE
         RETURN
         WITH pas1
              AS (SELECT Apellidos = SUBSTRING(@apellidos, 1, (CASE
                                                                   WHEN CHARINDEX(',', @apellidos) = 0
                                                                   THEN LEN(@apellidos)
                                                                   ELSE(CHARINDEX(',', @apellidos) - 1)
                                                               END))),
              pas2
              AS (SELECT Apellidos_rev = REVERSE(Apellidos)
                  FROM pas1),
              pas3
              AS (SELECT SUBSTRING(Apellidos_rev, 1, (CASE
                                                          WHEN CHARINDEX(' ', Apellidos_rev) = 0
                                                          THEN 0
                                                          ELSE CHARINDEX(' ', Apellidos_rev) - 1
                                                      END)) AS Apellido2_rev, 
                         SUBSTRING(Apellidos_rev, CHARINDEX(' ', Apellidos_rev) + 1, LEN(Apellidos_rev)) AS Apellido1_rev
                  FROM pas2)
              SELECT REVERSE(Apellido1_rev) AS Apellido1, 
                     REVERSE(Apellido2_rev) AS Apellido2
              FROM pas3;

    Con la función creada, busco los resultados.

    SELECT v.*
    FROM apellidos AS A
    cross apply fn_separaApellidos2 (A.NOMCOMPLETO) v

    Salida


    viernes, 6 de septiembre de 2019 7:40
  • Muchas gracias a todos, tu respuesta Javi Fernandez F fue la que me funciono muchas gracias.
    lunes, 9 de septiembre de 2019 14:47
  • De nada
    lunes, 9 de septiembre de 2019 15:13