it-swarm.com.de

Die Oracle REPLACE () - Funktion verarbeitet keine Zeilenumbrüche und Zeilenvorschübe

Wir haben eine Tabelle mit einer varchar2(100)-Spalte, die gelegentlich Wagenrücklauf und Zeilenvorschub enthält. Wir möchten diese Zeichen in der SQL-Abfrage entfernen. Wir benutzen:

REPLACE( col_name, CHR(10) ) 

das hat keine Auswirkung , das Ersetzen von "CHR (10)" durch ein herkömmlicheres "Buchstaben" belegt jedoch, dass die REPLACE-Funktion anders funktioniert. Das haben wir auch gefunden 

REPLACE( col_name, CHR(10), '_' ) 

findet den Ort der neuen Zeile, aber Einfügungen den Unterstrich danach, anstatt ihn zu ersetzen.

Läuft auf Oracle8i. Ein Upgrade ist keine Option.

16
Martin Cowie

Eine andere Möglichkeit ist die Verwendung von TRANSLATE :

TRANSLATE (col_name, 'x'||CHR(10)||CHR(13), 'x')

Das 'x' ist ein beliebiges Zeichen, das nicht in NULL übersetzt werden soll, da TRANSLATE nicht richtig funktioniert, wenn der 3. Parameter NULL ist.

39
Tony Andrews

Ah ah! Cade ist auf dem Geld.

Ein Artefakt in TOAD druckt \r\n als zwei Platzhalter-'blob'-Zeichen, druckt jedoch einen einzelnen \r auch als zwei Platzhalter. Der erste Schritt in Richtung einer Lösung ist zu verwenden ..

REPLACE( col_name, CHR(13) || CHR(10) )

.. aber ich entschied mich für die etwas robuster ..

REPLACE(REPLACE( col_name, CHR(10) ), CHR(13) )

.., das beleidigende Zeichen in beliebiger Reihenfolge auffängt. Vielen Dank an Cade.

M.

19
Martin Cowie

Sind Sie sicher, dass es sich bei Ihrem Newline nicht um CHR(13) + CHR(10) handelt. In diesem Fall enden Sie mit CHR(13) + '_', das möglicherweise immer noch wie ein Newline aussieht.

REPLACE(col_name, CHR(13) + CHR(10), '') ausprobieren

13
Cade Roux

Wenn die Daten in Ihrer Datenbank von HTML-Formular-TextArea-Steuerelementen POSTIERT werden, verwenden verschiedene Browser unterschiedliche New Line-Zeichen:

Firefox trennt Zeilen nur mit CHR (10)

Internet Explorer trennt Zeilen mit CHR (13) + CHR (10)

Apple (Pre-OSX) trennt Zeilen nur mit CHR (13)

Vielleicht brauchen Sie so etwas wie:

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '')
7
Gordon Bell

Ich wollte nur eine Notiz fallen lassen. Ich hatte Probleme beim Formatieren eines Text-4000-Feldes, das einen eigenen Kopf hatte, und der Text schien zufällig in den Bericht einzuwickeln (oder nicht umbrochen). Beim Aktualisieren der Spalte mit dem oben angegebenen Platzhalter chr (10). Mein Bericht wurde schließlich so formatiert, wie ich wollte. Vielen Dank!

1
Chris Brown

Wenn Ihr Zeilenvorschubzeichen CRLF ist, bedeutet dies, dass es eine CHR(13) ist, gefolgt von CHR(10). Wenn Sie REPLACE(input, CHR(10), '_') verwenden, wird daraus CHR(13) gefolgt von einem Unterstrich. Da CR für sich allein genauso gut gerendert werden kann wie ein Zeilenvorschub, wird erscheinen für Sie so, als ob ein Unterstrich hinter Ihrem Zeilenvorschub eingefügt wurde, aber eigentlich nur die Hälfte Ihres Newline wurde ersetzt.

Verwenden Sie REPLACE(REPLACE(input, CHR(13)), CHR(10)), um alle CR und LF zu ersetzen.

0
SQB