Dividir el valor de un campo a dos

Resuelto tsiger asked hace 14 años • 14 respuestas

Tengo un campo de tabla membernameque 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).

tsiger avatar Apr 23 '10 14:04 tsiger
Aceptado

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;
Daniel Vassallo avatar Apr 23 '2010 07:04 Daniel Vassallo

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
    );
smhg avatar Sep 26 '2012 10:09 smhg