sql >> Database >  >> RDS >> Oracle

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

Hieronder staan ​​twee methoden voor het retourneren van rijen die alleen niet-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 en deze vervolgens te negeren met de NOT telefoniste.

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 niet-alfanumerieke tekens bevatten.

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

Resultaat:

()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“

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

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 NOT REGEXP_LIKE(c1, '[A-Za-z0-9]');

Resultaat:

()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“
é
É
ø

In dit geval omvatte mijn uitsluitingsbereik geen alfanumerieke tekens zoals é , É , en ø , en dus is de uitvoer geen echte weergave van niet-alfanumerieke tekens.

Hier is een voorbeeld van het uitbreiden van het bereik om die tekens van de uitvoer uit te sluiten:

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

Resultaat:

()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“

  1. Hoe records van de huidige maand in MySQL te krijgen

  2. ODBC-verbindingskenmerken instellen zonder code te hoeven schrijven

  3. Haal de dagnaam uit een datum in PostgreSQL

  4. Postgres:een standaardwaarde definiëren voor CAST-fouten?