UPDATE table SET last_name = regexp_replace(last_name, '^' || name || ' ', '');
Esto solo elimina una copia del comienzo de la columna y elimina correctamente el espacio final.
Editar
estoy usando una expresión regular aquí. '^' || name || ' '
construye la expresión regular, por lo que con el ejemplo de 'Davis McDavis', construye la expresión regular '^Davis '
. El ^
hace que la expresión regular se ancle al principio de la cadena, por lo que va a coincidir con la palabra 'Davis' seguido de un espacio solo al comienzo de la cadena en la que está reemplazando, que es la columna last_name
.
Se podría lograr el mismo efecto sin expresiones regulares como esto:
UPDATE table SET last_name = substr(last_name, length(name) + 2);
Es necesario añadir dos a la longitud para crear el desplazamiento debido substr es a base de un (1) y que desea incluir el espacio (+1). Sin embargo, prefiero la solución de expresión regular a pesar de que probablemente tenga un peor rendimiento porque me parece un poco más documentada. Tiene la ventaja adicional de que es idempotente: si lo ejecuta nuevamente en la base de datos, no tendrá ningún efecto. El método substr/offset
no es idempotente; si lo ejecuta nuevamente, comerá más caracteres de su apellido.
¿Qué pasa con los espacios entre las palabras? –
Sí, ese es el espacio final que manejo al agregar '|| '' 'hasta el final. ¿Tiene otros problemas de espacio en blanco de lo que uno deduciría de su pregunta? –
@Daniel Lyons: ¿Podría explicar cómo funciona su expresión regular? gracias – lvil