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

J'ai besoin de couper la nouvelle ligne (Chr (13) et Chr (10) et L'Espace Tab depuis le début et la fin d'une chaîne) dans une requête Oracle. J'ai appris qu'il n'y a pas de moyen facile de couper plusieurs personnages dans Oracle. la fonction "trim" ne règle qu'un seul caractère. Ce serait une dégradation des performances si j'appelle récursivement la fonction trim dans une boucle en utilisant une fonction. J'ai entendu regexp_replace peut correspondre aux espaces blancs et les supprimer. Pouvez-vous guider d'un moyen fiable d'utiliser regexp_replace pour couper plusieurs espaces d'onglets ou de nouvelles lignes ou des combinaisons d'entre eux au début et à la fin d'une chaîne. S'il y a un autre moyen, veuillez me guider.

30
demandé sur OMG Ponies 2010-02-16 00:00:02

12 réponses

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

Cela supprimera toutes les occurrences de chaque caractère dans string1:

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

Regexp_replace est une option, mais vous pouvez voir un hit de performance en fonction de la complexité de votre expression.

15
répondu David Mann 2010-02-15 21:37:27

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 rationnelle ([[:cntrl:]])|(^\t) supprimera les caractères et les onglets non imprimables.

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 est utile.

29
répondu Nick Pierpoint 2016-01-06 09:00:59

Voici comment je l'implémenterais:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
14
répondu Marco 2014-05-07 10:59:11

Vous pouvez utiliser à la fois LTRIM et RTRIM.

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

Si vous voulez couper CHR (13) seulement quand il est livré avec un CHR (10), cela devient plus compliqué. Tout d'abord, traduit la chaîne combinée en un seul caractère. Ensuite, 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
répondu Gary Myers 2010-02-16 00:23:48

Pour quelle version D'Oracle? 10g + supporte les expressions rationnelles-voir t son fil sur le forum de Discussion OTN pour savoir comment utiliser REGEXP_REPLACE pour changer les caractères non imprimables en ''.

3
répondu OMG Ponies 2010-02-15 21:32:47
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

Le ' d ' est un caractère fictif, car translate ne fonctionne pas si le 3ème paramètre est null.

2
répondu rcp 2017-01-31 13:34:13

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

0
répondu Alex S 2010-02-16 16:31:19

Le code ci-dessous peut être utilisé pour supprimer la nouvelle ligne et L'espace de Table dans la colonne de texte

Select replace(replace(TEXT,char(10),''),char(13),'')
0
répondu Trilochan Nayak 2015-02-04 12:12:27

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
répondu sreeharibabu 2016-01-08 02:50:20

Je sais que ce n'est pas une réponse stricte à cette question, mais j'ai travaillé dans plusieurs scénarios où vous devez transformer des données de texte en suivant ces règles:

  1. Non espaces ou ctrl caractères au début de la chaîne
  2. Non espaces ou ctrl caractères à la fin de la chaîne
  3. Multiples ocurrencies de espaces ou ctrl caractères sera remplacé à un unique l'espace

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
répondu jackattack 2016-06-30 13:26:13
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
0
répondu reeko 2016-10-06 07:53:04

Au lieu d'utiliser regexp_replace Utilisation multiple du temps {[2] } comme indiqué ci-dessous;

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
0
répondu Raghwendra Kumar Mishra 2018-09-07 11:00:42