Oracle
 sql >> Baza danych >  >> RDS >> Oracle

2 sposoby zwracania wierszy zawierających tylko znaki alfanumeryczne w Oracle

Poniżej znajdują się dwie metody zwracania wierszy zawierających tylko znaki alfanumeryczne w bazie danych Oracle.

Znaki alfanumeryczne to znaki alfabetu i znaki numeryczne.

Przykładowe dane

W naszych przykładach użyjemy następujących danych:

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;

Wynik:

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

Opcja 1:Porównaj z [:alnum:]

Możemy użyć Oracle REGEXP_LIKE() funkcja do porównania wartości z wyrażeniem regularnym.

Możliwości wyrażeń regularnych Oracle obejmują obsługę klas znaków POSIX. Dlatego możemy użyć [:alnum:] Klasa znaków POSIX w naszych wyrażeniach regularnych do znajdowania wierszy zawierających znaki alfanumeryczne.

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

Wynik:

Music
Café
007
é
É
ø

To zwróciło tylko te wiersze, które zawierają tylko znaki alfanumeryczne. Jeśli wiersz zawiera zarówno znaki alfanumeryczne, jak i niealfanumeryczne, nie jest on zwracany.

Zwróć uwagę, że znak spacji jest uważany za niealfanumeryczny, więc jeśli chcemy uwzględnić spacje, możemy to zrobić:

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

Wynik:

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

Aby zwrócić wszystkie wiersze, które zawierają znaki alfanumeryczne (nawet jeśli wiersz zawiera również znaki niealfanumeryczne), możemy to zrobić:

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

Wynik:

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

Opcja 2:Określ zakres znaków

Innym sposobem na to jest określenie zakresu znaków w wyrażeniu regularnym.

Przykład:

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

Wynik:

Music
007

Zauważysz, że zwróciło to mniej wierszy niż w naszym pierwszym przykładzie. To dlatego, że nie dodałem é , É lub ø znaków w moim zakresie, więc wszystkie wiersze zawierające te znaki są wykluczane z danych wyjściowych.

Dlatego musisz zachować ostrożność podczas korzystania z tej metody, na wypadek przypadkowego wykluczenia znaków, które powinieneś uwzględnić.

Oto znowu z zakresem obejmującym te znaki:

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

Wynik:

Music
Café
007
é
É
ø

Możemy dołączyć takie spacje:

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

Wynik:

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

I możemy użyć poniższego, aby uwzględnić wszystkie wiersze, które zawierają znaki z naszego zakresu (nawet jeśli zawierają również znaki spoza tego zakresu):

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

Wynik:

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

Lub jeśli nie chcemy uwzględniać tych znaków Unicode, możemy to uprościć do tego:

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

Wynik:

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

Nie wyklucza to tych znaków Unicode z danych wyjściowych, jeśli dzielą wiersz ze znakami alfanumerycznymi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zatrzymaj się przy błędzie kompilacji w skrypcie sqlplus

  2. Jak utworzyć użytkownika w Oracle Multitenant 12c bez prefiksu C##?

  3. Uciekający znak ampersand w ciągu SQL

  4. Nie daj się zwieść kałuży strumieni

  5. Dlaczego Oracle 10g nie narzeka na niejednoznaczność kolumn?