2009-01-02 13 views
11

Nous avons une table avec une colonne varchar2(100), qui contient parfois des retours à la ligne &. Nous aimerions supprimer ces caractères dans la requête SQL. Nous utilisons:La fonction Oracle REPLACE() ne gère pas les retours chariot et les sauts de ligne

REPLACE(col_name, CHR(10)) 

qui a aucun effet, en remplaçant toutefois le caractère « CHR (10) » pour une « lettre » plus classique prouve que la fonction fonctionne REMPLACER autrement. Nous avons également constaté que

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

trouve l'emplacement de la nouvelle ligne, mais inserts 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.

Répondre

31

Une autre façon est d'utiliser TRANSLATE:

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

Le « x » est un caractère que vous ne voulez pas travailler à NULL traduit, parce que TRADUIRE n'a pas droit si le Le troisième paramètre est null.

+0

Pourriez-vous élaborer sur la partie «x» du code? Je ne suis pas. Je comprends que vous devez spécifier un remplacement, mais pourquoi devez-vous inclure le remplacement au début du deuxième argument? –

+1

Si vous écrivez 'TRANSLATE (nom_colonne, CHR (10) || CHR (13), null)' alors cela ne fonctionnera pas - il retournera toujours NULL (une anomalie de manipulation nulle). Si vous écrivez 'TRANSLATE (nom_col, CHR (10) || CHR (13), 'x')' alors il convertira chaque CHR (10) en 'x', ce qui n'est pas ce que l'on veut. Si nous préfixons les deux arguments avec un 'x', alors il traduira 'x' en 'x' et CHR (10), CHR (13) en null, donnant le résultat désiré. –

+0

Gotcha, c'est ce que signifie cette partie de la référence 'Dans ce cas, les caractères supplémentaires à la fin de from_string n'ont aucun caractère correspondant dans to_string. Si ces caractères supplémentaires apparaissent dans char, ils sont supprimés de la valeur de retour. Merci! –

12

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

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

+0

Merci pour cela, cela m'a vraiment aidé. J'ai dû exporter du contenu de base de données vers un système externe, en utilisant un CSV (je n'ai pas choisi cela ...), et je voulais convertir les retours chariot en un simple point. Je voulais juste ajouter que j'avais une erreur de syntaxe avec le signe "+" et que je devais le remplacer par un "||" comme ceci: 'REPLACE (col_name, CHR (13) || CHR (10), '')' –

5

Si les données de votre base de données est PUBLIÉ des contrôles TextArea formulaire HTML, les différents navigateurs utilisent différents caractères Nouvelle ligne:

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

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

Pomme (pré-OSX) sépare les lignes avec CHR (13) seulement

Vous aurez peut-être besoin de quelque chose comme:

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '') 
15

Ahah! 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 comme deux espaces réservés. La 1ère étape vers une solution consiste à utiliser ..

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

.. mais j'ai opté pour le peu plus robuste ..

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

.. qui attire les caractères offenser dans un ordre quelconque. Mes remerciements à Cade.

M.

+0

La fonction DUMP() est un bon moyen de vérifier le contenu réel d'une colonne en cas de doute –

0

Si votre caractère de nouvelle ligne est CRLF, cela signifie qu'il s'agit d'un CHR(13) suivi de CHR(10). Si vous REPLACE(input, CHR(10), '_'), cela se transforme en CHR(13) suivi d'un trait de soulignement.Puisque CR seul peut être rendu comme un caractère de nouvelle ligne, apparaît comme comme si un trait de soulignement avait été inséré après votre saut de ligne, mais réellement seulement la moitié de votre saut de ligne a été remplacée. Utilisez REPLACE(REPLACE(input, CHR(13)), CHR(10)) pour remplacer tous les CR et LF.

1

Je voulais juste laisser tomber une note. J'avais du mal à mettre en forme un champ de texte 4000 qui avait un esprit propre et le texte semblerait envelopper (ou ne pas envelopper) de manière aléatoire sur le rapport. Lorsque j'ai mis à jour la colonne en utilisant le remplacer chr (10) noté ci-dessus. Mon rapport a finalement été formaté comme je le voulais. Beaucoup Thanx!

Questions connexes