Esto toma smhg de aquí y los cortes del último índice de una subcadena dada en MySQL y los combina. Esto es para mysql, todo lo que necesitaba era obtener una división de nombre decente de nombre_ apellido_nombre con el apellido una sola palabra, el primer nombre todo antes de esa sola palabra, donde el nombre podría ser nulo, 1 palabra, 2 palabras, o Más de 2 palabras. Es decir: nulo; María; Mary Smith Mary A. Smith; Mary Sue Ellen Smith;
Entonces, si nombre es una palabra o nulo, last_name es nulo. Si el nombre es> 1 palabra, apellido es la última palabra y nombre_todas las palabras anteriores a la última palabra.
Tenga en cuenta que ya he recortado cosas como Joe Smith Jr.; Joe Smith Esq. y así sucesivamente, manualmente, lo cual fue doloroso, por supuesto, pero fue lo suficientemente pequeño como para hacer eso, por lo que debe asegurarse de mirar realmente los datos en el campo de nombre antes de decidir qué método usar.
Tenga en cuenta que esto también recorta el resultado, por lo que no termina con espacios delante o después de los nombres.
Solo estoy publicando esto para otros que podrían buscar en Google buscando lo que necesitaba. Esto funciona, por supuesto, pruébelo primero con el select.
Es una cosa única, así que no me importa la eficiencia.
SELECT TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
) AS first_name,
TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
) AS last_name
FROM `users`;
UPDATE `users` SET
`first_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
LEFT(`name`, LENGTH(`name`) - LOCATE(' ', REVERSE(`name`))),
`name`
)
),
`last_name` = TRIM(
IF(
LOCATE(' ', `name`) > 0,
SUBSTRING_INDEX(`name`, ' ', -1) ,
NULL
)
);