Poniżej znajdują się dwie metody zwracania wierszy zawierających tylko znaki niealfanumeryczne 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()
funkcji do porównania wartości z wyrażeniem regularnym, a następnie zanegowania jej za pomocą NOT
operatora.
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 niealfanumeryczne.
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');
Wynik:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“
To zwróciło tylko te wiersze, które zawierają tylko znaki niealfanumeryczne. Jeśli wiersz zawiera zarówno znaki alfanumeryczne, jak i niealfanumeryczne, nie jest on zwracany.
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 NOT REGEXP_LIKE(c1, '[A-Za-z0-9]');
Wynik:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“ é É ø
W tym przypadku mój zakres wykluczeń nie obejmował znaków alfanumerycznych, takich jak é
, É
i ø
, a więc dane wyjściowe nie są prawdziwą reprezentacją znaków niealfanumerycznych.
Oto przykład rozszerzenia zakresu, aby wykluczyć te znaki z danych wyjściowych:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');
Wynik:
() [email protected]#&()–[{}]:;',?/* `~$^+=<>“