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.
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.
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.
Voici comment je l'implémenterais:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
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;
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 ''
.
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.
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.
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),'')
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
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:
- Non espaces ou ctrl caractères au début de la chaîne
- Non espaces ou ctrl caractères à la fin de la chaîne
- 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.
Au lieu d'utiliser regexp_replace
Utilisation multiple du temps {[2] } comme indiqué ci-dessous;
SELECT regexp_replace('TEXT','(\s)','')
FROM dual;