sql >> Database >  >> RDS >> Oracle

2 manieren om rijen te retourneren die alleen alfanumerieke tekens bevatten in Oracle

Hieronder vindt u twee methoden voor het retourneren van rijen die alleen alfanumerieke tekens bevatten in Oracle Database.

Alfanumerieke tekens zijn alfabetische tekens en numerieke tekens.

Voorbeeldgegevens

We gebruiken de volgende gegevens voor onze voorbeelden:

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;

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Optie 1:Vergelijk met [:alnum:]

We kunnen Oracle's REGEXP_LIKE() . gebruiken functie om de waarde te vergelijken met een reguliere expressie.

De reguliere expressiemogelijkheid van Oracle omvat ondersteuning voor de POSIX-tekenklassen. Daarom kunnen we de [:alnum:] . gebruiken POSIX-tekenklasse in onze reguliere expressies om de rijen te vinden die alfanumerieke tekens bevatten.

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

Resultaat:

Music
Café
007
é
É
ø

Dat leverde alleen die rijen op die alleen alfanumerieke tekens bevatten. Als een rij zowel alfanumerieke als niet-alfanumerieke tekens bevat, wordt deze niet geretourneerd.

Merk op dat het spatieteken als niet-alfanumeriek wordt beschouwd, en dus als we spaties willen opnemen, kunnen we dit doen:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

Alle rijen retourneren die bevatten alfanumerieke tekens (zelfs als de rij ook niet-alfanumerieke tekens bevat), kunnen we dit doen:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[[:alnum:]]');

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Optie 2:specificeer een reeks tekens

Een andere manier om dit te doen, is door een reeks tekens in uw reguliere expressie op te geven.

Voorbeeld:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');

Resultaat:

Music
007

U zult merken dat dit minder rijen opleverde dan bij ons eerste voorbeeld. Dit komt omdat ik de é . niet heb opgenomen , É , of ø tekens in mijn bereik, en dus worden alle rijen die deze tekens bevatten uitgesloten van de uitvoer.

Daarom moet u voorzichtig zijn bij het gebruik van deze methode, voor het geval u per ongeluk tekens uitsluit die u zou moeten opnemen.

Hier is het weer met een bereik dat deze tekens bevat:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');

Resultaat:

Music
Café
007
é
É
ø

We kunnen spaties als deze opnemen:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

En we kunnen het volgende gebruiken om alle rijen op te nemen die bevatten tekens uit ons assortiment (zelfs als ze ook tekens buiten dit bereik bevatten):

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Of als we die Unicode-tekens niet willen opnemen, kunnen we het tot dit vereenvoudigen:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');

Resultaat:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é 123
ø 123

Dit sluit die Unicode-tekens niet uit van de uitvoer als ze toevallig een rij delen met alfanumerieke tekens.


  1. SQL Server:drop-tabel cascade-equivalent?

  2. SQL-injectie in Node.js voorkomen

  3. MySQL ISNULL() uitgelegd

  4. Oracle, PDO_OCI versus OCI8