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
risposta
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 è.
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 –
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
Hmm, i commenti StackOverflow sostituiscono gli spazi consecutivi con uno solo. Dovrebbero esserci tre spazi tra il '' nella dichiarazione SQL sopra. – Wouter
Per quale versione di Oracle? 10g + supporta regex - vedere t his thread on the OTN Discussion forum for how to use REGEXP_REPLACE per modificare i caratteri non stampabili in ''
.
È 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.
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.
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à.
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. –
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' –
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. –
questo come avrei implementarlo:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
Non sono sicuro del motivo per cui non ha ricevuto più attenzione! È l'unica risposta giusta sulla pagina. E anche conciso. – cartbeforehorse
questa è la migliore risposta – cagri
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),'')
Non funziona. Ci possono essere 'chr (13)' o 'chr (10)' nel mezzo della stringa come originariamente pubblicato nella domanda. – cartbeforehorse
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
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 :
- Nessun spazi o chars ctrl all'inizio della strIn g
- Nessun spazi o chars ctrl alla fine della stringa
- 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.
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
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. –
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. –
Non risolve il problema. Causa 'ORA-30001' – cartbeforehorse
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')
Il 'd' è un personaggio fittizio, perché tradurre non funziona se il terzo parametro è nullo.
La funzione "ritaglio" non rimuove solo un singolo carattere. Rimuove tutti gli spazi bianchi. –
Ciao Seshan. Sono state utili le risposte di seguito? –
Vado a controllare. Controllerà e ti farà sapere .. – Seshan