it-swarm.com.de

Schneiden Sie Whitespaces (neue Zeilen- und Tabulatorfläche) in einer Zeichenfolge in Oracle

Ich muss New Line (Chr (13) und Chr (10) und Tabulatorraum am Anfang und Ende eines Strings) in einer Oracle-Abfrage trimmen. Ich habe gelernt, dass es keine einfache Möglichkeit gibt, mehrere Zeichen in Oracle zu trimmen. "trim" -Funktion schneidet nur ein einzelnes Zeichen. Es wäre eine Leistungsverschlechterung, wenn ich die trim-Funktion in einer Schleife mit einer Funktion rekursiv aufrufe. Ich habe gehört, dass regexp_replace die Whitespaces abgleichen und entfernen kann. Können Sie eine zuverlässige Methode zur Verwendung von regexp_replace angeben, um mehrere Tab-Bereiche oder neue Zeilen oder Kombinationen davon am Anfang und Ende eines Strings zu trimmen. Wenn es einen anderen Weg gibt, leite mich bitte. 

31
Seshan

Wie wäre es mit der schnellen und schmutzigen Übersetzungsfunktion? 

Dadurch werden alle Vorkommen jedes Zeichens in Zeichenfolge1 entfernt: 

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

Regexp_replace ist eine Option. Je nach Komplexität Ihres Ausdrucks kann jedoch ein Leistungseinbruch angezeigt werden. 

15
David Mann

Wenn Sie Oracle 10g haben, ist REGEXP_REPLACE ziemlich flexibel.

Verwenden Sie die folgende Zeichenfolge als Test:

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

Der [[:space:]] entfernt alle Leerzeichen und der ([[:cntrl:]])|(^\t) regexp entfernt nicht druckbare Zeichen und Registerkarten.

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
    )

Rückkehr:

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

Hoffe, das ist von Nutzen.

32
Nick Pierpoint

So würde ich es umsetzen: 

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

Sie können sowohl LTRIM als auch RTRIM verwenden.

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

Wenn Sie CHR (13) nur mit CHR (10) zuschneiden möchten, wird dies komplizierter. Zuerst wurde die kombinierte Zeichenfolge in ein einzelnes Zeichen übersetzt. Dann LTRIM/RTRIM dieses Zeichen, dann das Einzelzeichen wieder in die kombinierte Zeichenfolge setzen.

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

Das 'd' ist ein Dummy-Zeichen, da translate nicht funktioniert, wenn der 3. Parameter den Wert null hat.

4
rcp

Für welche Version von Oracle? 10g + unterstützt reguläre Ausdrücke - siehe t sein Thread im OTN-Diskussionsforum zur Verwendung von REGEXP_REPLACE , um nicht druckbare Zeichen in '' zu ändern.

3
OMG Ponies

Versuchen Sie den Code unten. Es funktioniert, wenn Sie mehrere Zeilen in einer einzelnen Spalte eingeben.

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; 

Ausgabe: Test erster Test zweiter Test dritter 

0
sreeharibabu

Verwenden Sie anstelle von regexp_replace mehrere Male (\s) wie unten angegeben.

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

Der folgende Code kann zum Entfernen einer neuen Zeile und eines Tabellenbereichs in der Textspalte verwendet werden

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

Wenn die Oracle-Lösung zu kompliziert erscheint, erstelle ich eine Java-Klasse mit statischen Methoden und installiere sie als Paket in Oracle. Dies ist möglicherweise nicht so leistungsfähig, aber Sie werden eventuell andere Fälle finden (z. B. Datumsumwandlung in Millisekunden), in denen der Java-Fallback hilfreich ist.

0
Alex S

Ich weiß, dass dies keine strikte Antwort auf diese Frage ist, aber ich habe in verschiedenen Szenarien gearbeitet, in denen Sie Textdaten nach diesen Regeln umwandeln müssen:

  1. Nein  räume oder  strg-Zeichen am Anfang der Zeichenfolge
  2. Nein  räume oder  strg-Zeichen am Ende der Zeichenfolge
  3. Mehrere Vorkommen von räume oder  strg-Zeichen wird zu einer Einzelperson ersetzt space  

Der folgende Code folgt den oben beschriebenen Regeln:

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