Di seguito sono riportati due metodi per restituire righe che contengono solo caratteri non alfanumerici in Oracle Database.
I caratteri alfanumerici sono caratteri alfabetici e caratteri numerici.
Dati campione
Utilizzeremo i seguenti dati per i nostri esempi:
CREATE TABLE t1 (
c1 varchar(255) NULL
);
INSERT INTO t1 (c1)
WITH c AS (
SELECT 'Music' FROM DUAL UNION ALL
SELECT 'Live Music' FROM DUAL UNION ALL
SELECT 'Café' FROM DUAL UNION ALL
SELECT 'Café Del Mar' FROM DUAL UNION ALL
SELECT '100 Cafés' FROM DUAL UNION ALL
SELECT '[email protected]' FROM DUAL UNION ALL
SELECT '1 + 1' FROM DUAL UNION ALL
SELECT '()' FROM DUAL UNION ALL
SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
SELECT '`~$^+=<>“' FROM DUAL UNION ALL
SELECT '$1.50' FROM DUAL UNION ALL
SELECT 'Player 456' FROM DUAL UNION ALL
SELECT '007' FROM DUAL UNION ALL
SELECT 'é' FROM DUAL UNION ALL
SELECT 'É' FROM DUAL UNION ALL
SELECT 'é 123' FROM DUAL UNION ALL
SELECT 'ø' FROM DUAL UNION ALL
SELECT 'ø 123' FROM DUAL)
SELECT * FROM c;
SELECT c1 FROM t1;
Risultato:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 () [email protected]#&()–[{}]:;',?/* `~$^+=<>“ $1.50 Player 456 007 é É é 123 ø ø 123
Opzione 1:confronta con [:alnum:]
Possiamo utilizzare REGEXP_LIKE()
di Oracle funzione per confrontare il valore con un'espressione regolare, quindi negarlo con NOT
operatore.
La funzionalità di espressione regolare di Oracle include il supporto per le classi di caratteri POSIX. Pertanto, possiamo usare il [:alnum:]
classe di caratteri POSIX nelle nostre espressioni regolari per trovare le righe che contengono caratteri non alfanumerici.
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');
Risultato:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“
Ciò ha restituito solo quelle righe che contengono solo caratteri non alfanumerici. Se una riga contiene sia caratteri alfanumerici che non alfanumerici, non viene restituita.
Opzione 2:specifica un intervallo di caratteri
Un altro modo per farlo è specificare un intervallo di caratteri all'interno dell'espressione regolare.
Esempio:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[A-Za-z0-9]');
Risultato:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“ é É ø
In questo caso, il mio intervallo di esclusione non copriva i caratteri alfanumerici come é
, É
e ø
, e quindi l'output non è una vera rappresentazione di caratteri non alfanumerici.
Ecco un esempio di espansione dell'intervallo per escludere quei caratteri dall'output:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');
Risultato:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“