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