web-dev-qa-db-fra.com

La fonction Oracle REPLACE () ne gère pas les retours chariots et les sauts de ligne

Nous avons une table avec une colonne varchar2(100), qui contient parfois des retours chariot et des sauts de ligne. Nous aimerions supprimer ces caractères dans la requête SQL. Nous utilisons:

REPLACE( col_name, CHR(10) ) 

qui a pas d'effet _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\f\f\fs d'un caractère 'lettre' plus conventionnel, cela prouve que la fonction REPLACE fonctionne autrement. Nous avons également constaté que 

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

trouve le location de la nouvelle ligne, mais insère le trait de soulignement après, plutôt que de le remplacer.

En cours d'exécution sur Oracle8i. La mise à niveau n'est pas une option.

16
Martin Cowie

Une autre méthode consiste à utiliser TRANSLATE :

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

Le «x» est un caractère que vous ne voulez pas traduire en null, car TRANSLATE ne fonctionne pas correctement si le troisième paramètre est null.

39
Tony Andrews

Ah ah! Cade est sur l'argent.

Un artefact dans TOAD imprime \r\n en tant que deux caractères "blob" d'espace réservé, mais imprime un seul \r également en tant que deux espaces réservés. La première étape vers une solution consiste à utiliser ..

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

.. mais j'ai opté pour le légèrement plus robuste ..

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

.. qui attrape les personnages fautifs dans n'importe quel ordre. Merci beaucoup à Cade.

M.

19
Martin Cowie

Etes-vous sûr que votre nouvelle ligne n'est pas CHR(13) + CHR(10), auquel cas vous vous retrouvez avec CHR(13) + '_', qui pourrait encore ressembler à une nouvelle ligne?

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

13
Cade Roux

Si les données de votre base de données proviennent de contrôles HTML TextArea sous forme HTML, différents navigateurs utilisent différents caractères Nouvelle ligne:

Firefox sépare les lignes avec CHR (10) seulement

Internet Explorer sépare les lignes avec CHR (13) + CHR (10)

Apple (pré-OSX) sépare les lignes avec CHR (13) uniquement

Donc, vous aurez peut-être besoin de quelque chose comme:

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

Je voulais juste laisser tomber une note. J'avais de la difficulté à mettre en forme un champ texte 4000 qui avait son propre esprit et le texte semblerait envelopper (ou non) au hasard dans le rapport. Lorsque j'ai mis à jour la colonne en utilisant le remplacement chr (10) noté ci-dessus. Mon rapport a finalement été formaté comme je le souhaitais. Merci beaucoup!

1
Chris Brown

Si votre caractère de nouvelle ligne est CRLF, cela signifie qu'il s'agit d'une CHR(13) suivie de CHR(10). Si vous REPLACE(input, CHR(10), '_'), cela se transforme en CHR(13) suivi d'un trait de soulignement. Étant donné que CR peut être aussi bien rendu qu'un caractère de nouvelle ligne, il vous apparaîtra comme si un trait de soulignement avait été inséré après votre nouvelle ligne, mais en fait seulement la moitié votre nouvelle ligne a été remplacée.

Utilisez REPLACE(REPLACE(input, CHR(13)), CHR(10)) pour remplacer tous les CR 's et LF' s.

0
SQB