cadena dividida con espacio en MYSQL

Tengo datos como

Name
-----------------
Ram Mohan
Ram Lal Mohan
Ram K Lal Mohan
...

Estoy usando:

select SUBSTRING_INDEX(Name,' ',1) from contact

para obtener el primer nombre

select SUBSTRING_INDEX(Name,' ',-1) from contact

para obtener el apellido

Estoy recibiendo datos como

first name     last name
------------------------
Ram              Mohan
Ram              Mohan
Ram              Mohan

pero los datos que debería ser como

    first name     last name
------------------------
Ram              Mohan
Ram Lal          Mohan
Ram K Lal        Mohan

sólo la última palabra después del espacio debe venir en el apellido el descanso debe venir en el primer nombre

¿Alguien puede ayudarme a encontrar una manera de lograr esto?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por byteninja8245


4 Respuestas:

  • Usted podría utilizar un reemplazo de regex aquí, suponiendo que usted está en MySQL 8+:

    SELECT
        REGEXP_REPLACE(Name, '\\s+\\S+$', '') AS first,
        SUBSTRING_INDEX(Name,' ', -1) AS last
    FROM contact;
    

    screen capture from demo link below

    Demo

    Para versiones anteriores de MySQL, y asumiendo que el apellido nunca aparecerá en ningún otro lugar del nombre, usted podría utilizar SUBSTRING_INDEX junto con REPLACE:

    SELECT
        REPLACE(Name, CONCAT(' ', SUBSTRING_INDEX(Name,' ', -1)), '') AS first,
        SUBSTRING_INDEX(Name,' ', -1) AS last
    FROM contact;
    

    Demo

    Este segundo enfoque básicamente elimina el apellido (más espacio principal) que ya estaba correctamente encontrando usando SUBSTRING_INDEX. Lo que queda atrás debe ser el primero, el medio, etc., componentes que desee.

    Respondida el Dec 17, 2020 a las 05:30 - por algorithmadept

    Votos positivos: 0 | Votos negativos: 0

  • Ya que puede obtener el apellido, puede eliminar ese número de caracteres para obtener el nombre de pila.

    select
        trim(left(Name,char_length(Name)-char_length(substring_index(Name,' ',-1)))) first_name,
        substring_index(Name,' ',-1) last_name
    from contact
    

    Tenga en cuenta que los apellidos pueden tener espacios en ellos (por ejemplo, "Walter de la Mare").

    fiddle

    Respondida el Dec 17, 2020 a las 05:35 - por apiartisan

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que la función SUBSTRING_INDEX que estás utilizando en MySQL no está funcionando como esperas cuando hay más de un espacio en la cadena. Para lograr lo que deseas, es posible utilizar una combinación de funciones de cadena en MySQL.

    Puedes probar con la siguiente consulta para obtener el primer nombre y el apellido de la manera que deseas:

    sql
    SELECT 
        SUBSTRING_INDEX(Name, ' ', 1) as first_name, 
        SUBSTRING(Name, LENGTH(SUBSTRING_INDEX(Name, ' ', 1)) + 2) as last_name
    FROM contact;
    

    En esta consulta, la función SUBSTRING_INDEX(Name, ' ', 1) te dará el primer nombre seleccionando la parte de la cadena hasta el primer espacio. Luego, se utiliza la función SUBSTRING para obtener el resto de la cadena después del primer espacio, que será el apellido.

    Con esta consulta, obtendrás los resultados esperados para los nombres que tienes en tu tabla.

    Espero que esta solución te sea de ayuda. Si tienes alguna otra pregunta, ¡estaré encantado de ayudarte!

    Respondida el Dec 18, 2020 a las 05:35 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para dividir correctamente el nombre en nombre de pila y apellido, puedes utilizar la siguiente consulta MySQL:

    sql
    SELECT
      SUBSTRING_INDEX(Name, ' ', 1) AS first_name,
      SUBSTRING_INDEX(SUBSTRING_INDEX(Name, ' ', 2), ' ', -1) AS last_name
    FROM contact;
    

    Esta consulta utiliza la función SUBSTRING_INDEX dos veces. La primera vez, divide el nombre en dos partes en el primer espacio, devolviendo el nombre de pila. La segunda vez, divide la parte restante (el apellido) en dos partes en el último espacio, devolviendo el apellido.

    El resultado será:

    
    first_name     last_name
    
    • -----------------------
    Ram Mohan Ram Lal Mohan Ram K Lal Mohan

    Esta consulta funciona porque el nombre siempre se divide en tres partes: nombre, apellido y cualquier nombre del medio que pueda existir. La primera llamada a SUBSTRING_INDEX devuelve el nombre de pila, mientras que la segunda llamada a SUBSTRING_INDEX devuelve el apellido, descartando cualquier nombre del medio.

    Respondida el Dec 18, 2020 a las 05:35 - por Gemini

    Votos positivos: 0 | Votos negativos: 0