web-dev-qa-db-fra.com

Découper les espaces (espaces de nouvelle ligne et de tabulation) dans une chaîne dans Oracle

Je dois couper New Line (Chr (13) et Chr (10) et l'espace de tabulation à partir du début et de la fin d'une chaîne) dans une requête Oracle. J'ai appris qu'il n'y avait pas de moyen facile de supprimer plusieurs caractères dans Oracle. La fonction "trim" supprime uniquement un caractère. Ce serait une dégradation des performances si j'appelle récursivement la fonction trim dans une boucle utilisant une fonction. J'ai entendu dire que regexp_replace pouvait correspondre aux espaces et les supprimer. Pouvez-vous trouver un moyen fiable d’utiliser regexp_replace pour supprimer plusieurs tabulations ou de nouvelles lignes ou combinaisons de celles-ci au début et à la fin d’une chaîne S'il y a un autre moyen, s'il vous plaît guidez-moi. 

31
Seshan

Que diriez-vous de la fonction de traduction rapide et sale? 

Cela supprimera toutes les occurrences de chaque caractère dans la chaîne1: 

SELECT translate(
           translate(
               translate(string1, CHR(10), '')
           , CHR(13), '')
       , CHR(09), '') as massaged
FROM BLAH;

Regexp_replace est une option, mais vous pouvez constater une baisse des performances en fonction de la complexité de votre expression. 

15
David Mann

Si vous avez Oracle 10g, REGEXP_REPLACE est assez flexible.

En utilisant la chaîne suivante comme test:

chr(9) || 'Q   qwer' || chr(9) || chr(10) ||
chr(13) || 'qwerqwer     qwerty' || chr(9) || 
chr(10) || chr(13)

Le [[:space:]] supprimera tous les espaces, et l'expression ([[:cntrl:]])|(^\t) supprimera les caractères non imprimables et les tabulations.

select
    tester,
    regexp_replace(tester, '(^[[:space:]]+)|([[:space:]]+$)',null)
            regexp_tester_1,
    regexp_replace(tester, '(^[[:cntrl:]^\t]+)|([[:cntrl:]^\t]+$)',null) 
            regexp_tester_2
from
    (
    select
        chr(9) || 'Q   qwer' || chr(9) || chr(10) ||
                chr(13) || 'qwerqwer     qwerty' || chr(9) || 
                chr(10) || chr(13) tester 
    from 
        dual
    )

Retour:

  • REGEXP_TESTER_1 : "Qqwerqwerqwerqwerty"
  • REGEXP_TESTER_2 : "Q qwerqwerqwer qwerty"

J'espère que cela vous sera utile.

32
Nick Pierpoint

Voici comment je le mettrais en œuvre: 

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
17
Marco

Vous pouvez utiliser LTRIM et RTRIM.

select rtrim(ltrim('abcdab','ab'),'ab') from dual;

Si vous voulez couper CHR (13) uniquement avec un CHR (10), cela devient plus compliqué. Tout d'abord, traduit la chaîne combinée en un seul caractère. Puis LTRIM/RTRIM ce caractère, puis remplacez le caractère unique par la chaîne combinée.

select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
9
Gary Myers
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

Le «d» est un caractère factice, car translate ne fonctionne pas si le troisième paramètre est null.

4
rcp

Pour quelle version d'Oracle? 10g + prend en charge les expressions rationnelles - voir t son sujet sur le forum de discussion OTN pour savoir comment utiliser REGEXP_REPLACE pour modifier les caractères non imprimables en ''.

3
OMG Ponies

Essayez le code ci-dessous. Cela fonctionnera si vous entrez plusieurs lignes dans une seule colonne.

create table  products (prod_id number , prod_desc varchar2(50));

insert into products values(1,'test first

test second

test third');

select replace(replace(prod_desc,chr(10),' '),chr(13),' ') from products  where prod_id=2; 

Sortie: test premier test deuxième test troisième 

0
sreeharibabu

Au lieu d'utiliser regexp_replace plusieurs fois, utilisez (\s) comme indiqué ci-dessous;

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;

Le code ci-dessous peut être utilisé pour supprimer une nouvelle ligne et un nouvel espace dans la colonne de texte.

Select replace(replace(TEXT,char(10),''),char(13),'')
0
Trilochan Nayak

Dans les cas où la solution Oracle semble trop compliquée, je crée une classe Java avec des méthodes statiques, puis l'installe en tant que package dans Oracle. Cela pourrait ne pas être aussi performant, mais vous finirez par trouver d'autres cas (conversion de date en millisecondes, par exemple) dans lesquels vous trouverez l'aide de secours Java utile.

0
Alex S

Je sais que la réponse à cette question n’est pas stricte, mais j’ai travaillé dans plusieurs scénarios dans lesquels vous devez transformer des données texte en respectant les règles suivantes:

  1. Non  les espaces ou  caractères ctrl au début de la chaîne
  2. Non  les espaces ou  caractères ctrl à la fin de la chaîne
  3. Plusieurs monnaies de les espaces ou  caractères ctrl sera remplacé par un seul space  

Code ci-dessous suivre les règles détaillées ci-dessus:

WITH test_view AS (
  SELECT CHR(9) || 'Q   qwer' || CHR(9) || CHR(10) ||
         CHR(13) || ' qwerqwer     qwerty  ' || CHR(9) || 
         CHR(10) || CHR(13) str
  FROM DUAL
) SELECT 
     str original
    ,TRIM(REGEXP_REPLACE(str, '([[:space:]][[:space:]]+)|([[:cntrl:]]+)', ' ')) fixed
  FROM test_view;


ORIGINAL               FIXED                 
---------------------- ----------------------
    Q   qwer           Q qwer qwerqwer qwerty

 qwerqwer     qwerty                                         

1 row selected.
0
jackattack
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
0
reeko