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;
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 conREPLACE
:SELECT REPLACE(Name, CONCAT(' ', SUBSTRING_INDEX(Name,' ', -1)), '') AS first, SUBSTRING_INDEX(Name,' ', -1) AS last FROM contact;
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").
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ónSUBSTRING
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
- -----------------------
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 aSUBSTRING_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