2011-10-20 37 views
41

Todo,Cómo eliminar retornos de carro y nuevas líneas en Postgresql?

Estoy atascado de nuevo tratando de obtener mis datos en un formato que lo necesito. Tengo un campo de texto que se ve así.

"DeAngelo 001 deangelo

origen local del nombre: italain

del nombre americano deangelo

significado: de los ángeles

espectro emocional • es una fuente de alegría para todos.

integridad personal • su buen nombre es su mos t activo valioso personalidad • ¡es difícil volar con águilas cuando estás rodeado de pavos! relaciones • se inicia lentamente, pero una relación con 0angelo se desarrolla con el tiempo. viajes & ocio • un viaje de su vida está en su futuro.

carrera & dinero • un niño superdotado, deangelo tendrá que ser desafiado constantemente.

oportunidades de vida • alegría y felicidad esperan a esta persona bendita.

números de la suerte de deangelo: 12 • 38 • 18 • 34 • 29 • 16

"

¿Cuál sería la mejor manera de estar en PostgreSQL para eliminar los retornos de carro y nuevas líneas tengo? intentado varias cosas y ninguna de ellas quiere que se comporten.

select regexp_replace(field, E'\r\c', ' ', 'g') from mytable 
    WHERE id = 5520805582 

SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ') 
    FROM mytable 
    WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]' 
    AND id = 5520805582; 

Gracias de antemano, Adam

Respuesta

97
select regexp_replace(field, E'[\\n\\r]+', ' ', 'g') 

leer el manual http://www.postgresql.org/docs/current/static/functions-matching.html

+14

Puede deshacerse de las barras diagonales dobles si suelta el prefijo 'E':' '[\ n \ r] +' '. Mirada mucho más limpia, imo. – jpmc26

+1

¿Qué hace la bandera 'g'? No se explica en el manual ... – Jens

+0

La documentación vinculada contiene el siguiente texto: '' ' El parámetro flags es una cadena de texto opcional que contiene cero o más indicadores de una sola letra que cambian el comportamiento de la función. Bandera i especifica la coincidencia insensible a mayúsculas y minúsculas, mientras que la bandera g especifica el reemplazo de cada subcadena coincidente en lugar de solo la primera. Los indicadores admitidos (aunque no g) se describen en la Tabla 9-20. '' ' – valgog

25
select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g') 

que tenía el mismo problema en mi postgres d/b, pero el salto de línea en cuestión no era el CRLF ASCII tradicional, fue un separador de línea Unicode, U2028 carácter. El fragmento de código anterior también capturará esa variación Unicode.

actualización ... aunque sólo he encontrado con los personajes antes mencionados "in the wild", seguir el consejo de lmichelbacher para traducir aún más unicode newline-like caracteres, utilice esto:

select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g') 
+1

Es posible que desee agregar otros caracteres Unicode "newline-y" a esa expresión regular: http://en.wikipedia.org/wiki/Newline#Unicode – lmichelbacher

10

OP pidió específicamente sobre expresiones regulares, ya que parece que hay preocupación por una serie de otros caracteres, así como líneas nuevas, pero para aquellos que solo quieren eliminar líneas nuevas, ni siquiera es necesario pasar a una expresión regular.Simplemente puede hacer:

select replace(field,E'\n',''); 

Creo que este es un comportamiento de SQL estándar, por lo que se debe extender de nuevo a todos, pero tal vez las versiones más tempranas de Postgres. Lo anterior probó bien para mí en el 9,4 y el 9,2

5

En el caso de que necesite para eliminar los saltos de línea desde el inicio o al final de la cadena, es posible utilizar este:

UPDATE table 
SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g'); 

Tenga en cuenta que el sombrero ^ significa el comienzo de la cadena y el signo de dólar $ significa el final de la cadena.

Espero que ayude a alguien.

Cuestiones relacionadas