По-долу са дадени два метода за връщане на редове, които съдържат само буквено-цифрови знаци в Oracle Database.
Буквено-цифровите знаци са букви и цифри.
Примерни данни
Ще използваме следните данни за нашите примери:
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;
Резултат:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 () [email protected]#&()–[{}]:;',?/* `~$^+=<>“ $1.50 Player 456 007 é É é 123 ø ø 123
Опция 1:Сравнете с [:alnum:]
Можем да използваме REGEXP_LIKE()
функция за сравняване на стойността с регулярен израз.
Възможността за регулярни изрази на Oracle включва поддръжка за POSIX символните класове. Следователно можем да използваме [:alnum:]
POSIX символен клас в нашите регулярни изрази, за да намерите редовете, които съдържат буквено-цифрови знаци.
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');
Резултат:
Music Café 007 é É ø
Това върна само онези редове, които не съдържат нищо освен буквено-цифрови знаци. Ако един ред съдържа както буквено-цифрови, така и не-буквени знаци, той не се връща.
Обърнете внимание, че символът за интервал се счита за небуквен и цифров и така, ако искаме да включим интервали, можем да направим това:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');
Резултат:
Music Live Music Café Café Del Mar 100 Cafés Player 456 007 é É é 123 ø ø 123
За да върнете всички редове, които съдържат буквено-цифрови знаци (дори редът да съдържа и не-буквени знаци), можем да направим това:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[[:alnum:]]');
Резултат:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é É é 123 ø ø 123
Опция 2:Посочете диапазон от знаци
Друг начин да го направите е да посочите диапазон от знаци във вашия регулярен израз.
Пример:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');
Резултат:
Music 007
Ще забележите, че това върна по-малко редове, отколкото с първия ни пример. Това е така, защото не включих é
, É
, или ø
символи в моя диапазон и така всички редове, които съдържат тези знаци, са изключени от изхода.
Ето защо ще трябва да бъдете внимателни, когато използвате този метод, в случай че случайно изключите знаци, които трябва да включите.
Ето го отново с диапазон, който включва тези знаци:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');
Резултат:
Music Café 007 é É ø
Можем да включим пространства като това:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');
Резултат:
Music Live Music Café Café Del Mar 100 Cafés Player 456 007 é É é 123 ø ø 123
И можем да използваме следното, за да включим всички редове, които съдържат знаци от нашия диапазон (дори и те да съдържат знаци извън този диапазон):
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');
Резултат:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é É é 123 ø ø 123
Или ако не искаме да включваме тези символи в Unicode, можем да го опростим до следното:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');
Резултат:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é 123 ø 123
Това не изключва тези уникод знаци от изхода, ако случайно споделят ред с буквено-цифрови знаци.