2012-02-28 8 views
6

He las siguientes dos columnas en la tabla de PostgresSQL - Retirar subcadena del texto de una columna

name | last_name 
---------------- 
AA | AA aa 
BBB | BBB bbbb 
.... | ..... 
.... | ..... 

¿Cómo puedo actualizar el last_name mediante la eliminación de name texto de la misma?

apagada final debe ser similar

name | last_name 
---------------- 
AA | aa 
BBB | bbbb 
.... | ..... 
.... | ..... 

Respuesta

12
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.

+0

¿Qué pasa con los espacios entre las palabras? –

+1

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? –

+0

@Daniel Lyons: ¿Podría explicar cómo funciona su expresión regular? gracias – lvil

4

No está seguro acerca de la sintaxis, pero intente esto:

UPDATE table 
SET last_name = TRIM(REPLACE(last_name,name,'')) 

Sugiero primero en comprobarlo seleccionando:

SELECT REPLACE(last_name,name,'') FROM table 
+1

Cerrar, pero dos problemas: no manejar espacios o si el nombre se produce en el apellido. Por ejemplo, si mi nombre fuera Davis McDavis, su texto original sería ' 'Davis McDavis'' y que cambiaría a'' Mc''. –

+0

¿Qué pasa con los espacios entre las palabras? –

+0

@Mithun: se agregó TRIM para manejar espacios. El problema de Daniel sigue siendo – lvil

Cuestiones relacionadas