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.
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.
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:
Qqwerqwerqwerqwerty
"Q qwerqwerqwer qwerty
"J'espère que cela vous sera utile.
Voici comment je le mettrais en œuvre:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
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;
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.
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 ''
.
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
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),'')
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.
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:
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.
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)