sql >> Databasteknik >  >> RDS >> Oracle

2 sätt att returnera rader som endast innehåller alfanumeriska tecken i Oracle

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.


  1. PHP MySQLI Förhindra SQL-injektion

  2. Tidszonlagring i datatyp tidsstämpel med tidszon

  3. Hur man arbetar med datumfunktioner i Oracle sql

  4. C#-parameteriserade frågor för Oracle - allvarlig och farlig bugg!