web-dev-qa-db-fra.com

Comment supprimer les retours chariot et les nouvelles lignes dans Postgresql?

Tout,

Je suis à nouveau coincé pour essayer d'obtenir mes données dans un format dont j'ai besoin. J'ai un champ de texte qui ressemble à ceci.

"deangelo 001 deangelo

origine locale du nom: italain

du nom américain deangelo

signification: des anges

spectre émotionnel • il est une source de joie pour tous.

intégrité personnelle • sa réputation est son atout le plus précieux. personnalité • il est difficile de monter en flèche avec les aigles lorsque vous êtes entouré de dindes! relations • commence lentement, mais une relation avec deangelo se construit avec le temps. voyages et loisirs • un voyage d'une vie est dans son avenir.

carrière & argent • un enfant surdoué, deangelo devra être constamment mis au défi.

les opportunités de la vie • La joie et le bonheur attendent cette personne bénie.

les numéros chanceux de deangelo: 12 • 38 • 18 • 34 • 29 • 16

"

Quel serait le meilleur moyen dans Postgresql d’enlever les retours chariots et les nouvelles lignes? J'ai essayé plusieurs choses et aucune d'entre elles ne veut se comporter.

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;

Merci d'avance, Adam

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

lisez le manuel http://www.postgresql.org/docs/current/static/functions-matching.html

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

J'ai eu le même problème dans mon postgres d/b, mais la nouvelle ligne en question n'était pas le CRLF traditionnel en asci, il s'agissait d'un séparateur de ligne unicode, le caractère U2028. L'extrait de code ci-dessus va également capturer cette variation unicode.

Mise à jour ... même si je n'ai jamais rencontré que les caractères susmentionnés "à l'état sauvage", pour suivre le conseil de lmichelbacher de traduire encore plus nicode newline-like caractères, utilisez ceci:

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

OP a posé une question spécifique sur les expressions rationnelles, car il semblerait que plusieurs autres caractères ainsi que les nouvelles lignes suscitent des préoccupations, mais pour ceux juste voulant supprimer les nouvelles lignes, vous n'avez même pas besoin de passer à une expression régulière. Vous pouvez simplement faire:

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

Je pense qu’il s’agit d’un comportement standard de SQL; il devrait donc s’appliquer à toutes les versions de Postgres, mais peut-être même aux toutes premières. Ce qui précède a bien fonctionné pour moi en 9.4 et 9.2

18
SeldomNeedy

Dans le cas où vous devez supprimer les sauts de ligne du début ou de la fin de la chaîne, vous pouvez utiliser ceci:

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

Rappelez-vous que le chapeau ^ signifie le début de la chaîne et le signe dollar $ signifie la fin de la chaîne.

J'espère que ça aidera quelqu'un.

7
Bernhar