Nedan finns två metoder för att returnera rader som endast innehåller alfanumeriska tecken i Oracle Database.
Alfanumeriska tecken är alfabetiska tecken och numeriska tecken.
Exempeldata
Vi använder följande data för våra exempel:
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;
Resultat:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 () [email protected]#&()–[{}]:;',?/* `~$^+=<>“ $1.50 Player 456 007 é É é 123 ø ø 123
Alternativ 1:Jämför med [:alnum:]
Vi kan använda Oracles REGEXP_LIKE()
funktion för att jämföra värdet med ett reguljärt uttryck.
Oracles kapacitet för reguljära uttryck inkluderar stöd för POSIX-teckenklasserna. Därför kan vi använda [:alnum:]
POSIX-teckenklass i våra reguljära uttryck för att hitta de rader som innehåller alfanumeriska tecken.
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');
Resultat:
Music Café 007 é É ø
Det returnerade bara de rader som inte innehåller annat än alfanumeriska tecken. Om en rad innehåller både alfanumeriska och icke-alfanumeriska tecken, returneras den inte.
Observera att mellanslagstecknet anses vara icke-alfanumeriskt, så om vi vill inkludera mellanslag kan vi göra detta:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');
Resultat:
Music Live Music Café Café Del Mar 100 Cafés Player 456 007 é É é 123 ø ø 123
För att returnera alla rader som innehåller alfanumeriska tecken (även om raden också innehåller icke-alfanumeriska tecken), kan vi göra detta:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[[:alnum:]]');
Resultat:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é É é 123 ø ø 123
Alternativ 2:Ange ett antal tecken
Ett annat sätt att göra det är att ange ett antal tecken i ditt reguljära uttryck.
Exempel:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');
Resultat:
Music 007
Du kommer att märka att detta gav färre rader än med vårt första exempel. Detta beror på att jag inte inkluderade é
, É
, eller ø
tecken i mitt intervall, så alla rader som innehåller dessa tecken exkluderas från utdata.
Därför måste du vara försiktig när du använder den här metoden, om du av misstag utesluter tecken som du bör inkludera.
Här är det igen med ett intervall som inkluderar dessa tecken:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');
Resultat:
Music Café 007 é É ø
Vi kan inkludera mellanslag så här:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');
Resultat:
Music Live Music Café Café Del Mar 100 Cafés Player 456 007 é É é 123 ø ø 123
Och vi kan använda följande för att inkludera alla rader som innehåller tecken från vårt intervall (även om de också innehåller tecken utanför detta intervall):
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');
Resultat:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é É é 123 ø ø 123
Eller om vi inte vill inkludera dessa unicode-tecken, kan vi förenkla det till detta:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');
Resultat:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é 123 ø 123
Detta utesluter inte dessa unicode-tecken från utdata om de råkar dela en rad med alfanumeriska tecken.