Domanda

In Oracle 10g, vorrei creare un'espressione regolare per elencare i personaggi che sono diverso tra due stringhe.

Ecco il motivo: Ho una tabella con un campo che contiene a volte caratteri Unicode che non sono in lingua francese.

Sono in grado di elencare le righe contenenti questi caratteri non standard per fare un futuro pulizia con questa query:

SELECT DataID, Name, CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC')  
  FROM table
  WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )

dove WE8ISO8859P1 - Europa occidentale (che accetto)

e WE8DEC - set di caratteri a 8 bit di Digital Equipment Corporation (che so che il supporto dell'applicazione)

Immagino che con un'espressione regolare Oracle sarei in grado di estrarre l'elenco di tutti questi caratteri non standard. Ma non ho familiarità con regexp in Oracle, quindi qualsiasi aiuto sarebbe apprezzato.

Ecco la mia idea (non funzionante):

select regexp_replace("éaé", '[a-z][A-Z]', '' ) from dual;

darebbe " & # 233; " come personaggio da pulire.

È stato utile?

Soluzione

Forse qualcosa del genere potrebbe portarti nella giusta direzione:

SQL> select regexp_replace('éaéABcdEF', '([a-zA-Z])', '' ) problems from dual;

PROBLEMS
--------
éé

Ti dà ogni ricorrenza dei personaggi che vuoi identificare, ma forse non è un problema o puoi perfezionarlo ...

Altri suggerimenti

Penso che il tuo unico errore sia stato usare le doppie virgolette per il primo parametro nella tua domanda. In genere le virgolette doppie vengono utilizzate solo per i nomi di colonne / tabelle.

Le paratie aggiunte da DCookie fanno corrispondere più volte la regex. A seconda di ciò che si trova nel campo del nome, potrebbe essere necessario aggiungere più caratteri alla clausola di sostituzione, inclusa la punteggiatura (utilizzare due virgolette singole per abbinare una citazione). Ecco un inizio per te:

SELECT regexp_replace(name, '([a-zA-Z ,.;''"])\-?','') problem_characters , count(*) 
FROM table
  WHERE NAME <> CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC' )
group by regexp_replace(name, '([a-zA-Z ,.;''"])\-?','');
SELECT LISTAGG( letter, '' ) WITHIN GROUP(ORDER BY letter) 
       FROM ( SELECT DISTINCT substr( 'aaaaabcde', level, 1 ) letter 
                     FROM dual CONNECT BY level <= length('aaaaabcde') )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top