Dividir el valor de un campo a dos
Tengo un campo de tabla membername
que contiene tanto el apellido como el nombre de los usuarios. ¿ Es posible dividirlos en 2 campos memberfirst
?memberlast
Todos los registros tienen este formato "Nombre Apellido" (sin comillas y con un espacio entre ellas).
Desafortunadamente MySQL no incluye una función de división de cadena. Sin embargo, puede crear una función definida por el usuario para esto, como la que se describe en el siguiente artículo:
- Función de cadena dividida MySQL por Federico Cargnelutti
Con esa función:
DELIMITER $$
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255) DETERMINISTIC
BEGIN
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
END$$
DELIMITER ;
podrá construir su consulta de la siguiente manera:
SELECT SPLIT_STR(membername, ' ', 1) as memberfirst,
SPLIT_STR(membername, ' ', 2) as memberlast
FROM users;
Si prefiere no utilizar una función definida por el usuario y no le importa que la consulta sea un poco más detallada, también puede hacer lo siguiente:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1) as memberfirst,
SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 2), ' ', -1) as memberlast
FROM users;
SELECCIONAR variante (sin crear una función definida por el usuario):
SELECT IF(
LOCATE(' ', `membername`) > 0,
SUBSTRING(`membername`, 1, LOCATE(' ', `membername`) - 1),
`membername`
) AS memberfirst,
IF(
LOCATE(' ', `membername`) > 0,
SUBSTRING(`membername`, LOCATE(' ', `membername`) + 1),
NULL
) AS memberlast
FROM `user`;
Este enfoque también se ocupa de:
- valores de nombre de miembro sin espacio : agregará la cadena completa a miembro primero y establecerá miembro último en NULL.
- valores de nombre de miembro que tienen múltiples espacios : agregará todo antes del primer espacio a miembro primero y el resto (incluidos espacios adicionales) a miembro último.
La versión ACTUALIZADA sería:
UPDATE `user` SET
`memberfirst` = IF(
LOCATE(' ', `membername`) > 0,
SUBSTRING(`membername`, 1, LOCATE(' ', `membername`) - 1),
`membername`
),
`memberlast` = IF(
LOCATE(' ', `membername`) > 0,
SUBSTRING(`membername`, LOCATE(' ', `membername`) + 1),
NULL
);