2010-02-15 12 views
25

Ho bisogno di tagliare nuova linea (Chr (13) e Chr (10) e spazio Tab dall'inizio e alla fine di una stringa) in una query Oracle. Ho imparato che non esiste un modo semplice per tagliare più personaggi in Oracle. la funzione "assetto" taglia solo un singolo carattere. Sarebbe un degrado delle prestazioni se chiamo recursivelly funzione trim in un ciclo utilizzando una funzione. Ho sentito che regexp_replace può abbinare gli spazi bianchi e rimuoverli. Puoi guidare un metodo affidabile per utilizzare regexp_replace per tagliare più tabulazioni o nuove linee o combinazioni di essi all'inizio e alla fine di una stringa. Se c'è un altro modo, per favore guidami.Trim Whitespace (Nuovo spazio per le linee e le tabulazioni) in una stringa in Oracle

+0

La funzione "ritaglio" non rimuove solo un singolo carattere. Rimuove tutti gli spazi bianchi. –

+1

Ciao Seshan. Sono state utili le risposte di seguito? –

+0

Vado a controllare. Controllerà e ti farà sapere .. – Seshan

risposta

12

E la funzione di traduzione rapida e sporca?

Questo rimuove tutte le occorrenze di ogni personaggio in stringa1:

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

REGEXP_REPLACE è un'opzione, ma si può vedere un calo di prestazioni a seconda di come complessa la tua espressione è.

+5

Questo è sbagliato su due livelli. Innanzitutto, ogni volta che si passa null (ad esempio '''') come terzo parametro a TRANSLATE, verrà sempre restituito null. In secondo luogo, TRANSLATE agisce sull'intera stringa, non solo all'inizio e alla fine di una stringa (come richiesto dall'OP). Refer: http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions216.htm#SQLRF06145 –

+2

Jeffrey ha ragione nel dire che è rotto, a meno che non si sostituisca '' con '' (spazi bianchi). Inoltre, translate consente di specificare più caratteri da sostituire contemporaneamente. Questo fa la stessa cosa: seleziona trim (translate ('example', chr (10) || chr (13) || chr (09), '')) come esempio da duale; Tieni presente che sostituisce sempre questi caratteri, ovunque nella stringa. – Wouter

+0

Hmm, i commenti StackOverflow sostituiscono gli spazi consecutivi con uno solo. Dovrebbero esserci tre spazi tra il '' nella dichiarazione SQL sopra. – Wouter

9

È possibile utilizzare sia LTRIM sia RTRIM.

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

Se si vuole tagliare CHR (13) solo se si tratta di un CHR (10) diventa più complicato. In primo luogo, ha tradotto la stringa combinata in un singolo carattere. Quindi LTRIM/RTRIM quel carattere, quindi rimpiazza il singolo carattere nella stringa combinata.

0

Nei casi in cui la soluzione Oracle sembra eccessivamente convoluta, creo una classe java con metodi statici e quindi la installo come pacchetto in Oracle. Questo potrebbe non essere altrettanto performante, ma alla fine troverai altri casi (ad esempio la conversione della data in millisecondi) dove troverai utile il fallback java.

25

Se si dispone di Oracle 10g, REGEXP_REPLACE è piuttosto flessibile.

Utilizzando la seguente stringa come un test:

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

Il [[:space:]] rimuoverà tutti gli spazi bianchi, e l'espressione regolare ([[:cntrl:]])|(^\t) rimuoverà i caratteri non stampabili e le schede.

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 
    ) 

Tornando:

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

Spero che questo sia di qualche utilità.

+0

Voto in aumento per il suggerimento REGEXP_REPLACE e l'esempio ben definito (ci dovrebbe essere un bonus speciale per quelli su SO). Ma non fa quello che l'OP ha chiesto, che è solo per rimuovere a * start * e * end * di una stringa multi-linea. Mi prenderò la libertà di modificare per regolare di conseguenza l'espressione regolare. –

+0

BTW durante il test, è molto più facile vedere cosa sta succedendo se si imposta il 3 ° parametro su 'regexp_replace' su a' '.'' invece di 'null' –

+0

Ciao @Andrew - grazie per l'upvote. Tuttavia, dovrò eseguire il rollback delle modifiche poiché la nuova versione ora significa che l'esempio non produce l'output indicato. Il punto dell'esempio era dimostrare l'ampiezza degli spazi bianchi che era gestita dai parametri '[[:::]]' e '[[: ctrl:]]'. Forse vorresti aggiornare la risposta per includere le espressioni modificate alla fine della risposta dopo il mio esempio semplificato. Inoltre, non sono d'accordo con l'uso di '.' invece di 'null' - il' null' rende chiaro il tuo sostituzione con nulla. –

12

questo come avrei implementarlo:

 REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)') 
+1

Non sono sicuro del motivo per cui non ha ricevuto più attenzione! È l'unica risposta giusta sulla pagina. E anche conciso. – cartbeforehorse

+0

questa è la migliore risposta – cagri

0

Di seguito il codice può essere utilizzato per rimuovere la New Line e spazio per il tavolo a colonna di testo

Select replace(replace(TEXT,char(10),''),char(13),'') 
+0

Non funziona. Ci possono essere 'chr (13)' o 'chr (10)' nel mezzo della stringa come originariamente pubblicato nella domanda. – cartbeforehorse

0

Prova il codice qui sotto. Funzionerà se si inseriscono più righe in una singola colonna.

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; 

uscita: prova seconda prova prima prova terzo

0

So che questa non è una risposta rigorosa per questa domanda, ma ho lavorato in diversi scenari in cui è necessario trasformare i dati testo che segue queste regole :

  1. Nessun spazi o chars ctrl all'inizio della strIn g
  2. Nessun spazi o chars ctrl alla fine della stringa
  3. più ocurrencies di spazi o chars ctrl saranno sostituiti da un unico spazio

codice qui sotto seguono le regole sopra descritte:

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
TRIM(BOTH chr(13)||chr(10)||' ' FROM str) 
+0

Buono a dare un po 'di codice, ma dovrebbe venire con qualche spiegazione per indicare le modifiche e perché è la soluzione della domanda dell'OP. –

+0

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. –

+0

Non risolve il problema. Causa 'ORA-30001' – cartbeforehorse

1
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd') 

Il 'd' è un personaggio fittizio, perché tradurre non funziona se il terzo parametro è nullo.

Problemi correlati