Встроенные в Oracle Классы строковых символов
Вопрос
Есть ли у Oracle встроенные константы класса строковых символов (цифры, буквы, алфавит, верхний, нижний и т.д.)?
Моя фактическая цель - эффективно возвращать только цифры [0-9] из существующей строки.
К сожалению, мы все еще используем Oracle 9, поэтому регулярные выражения здесь не подходят.
Примеры Поле должно содержать от нуля до трех букв, 3 или 4 цифры, затем от нуля до двух букв.Я хочу извлечь цифры.
String --> Result
ABC1234YY --> 1234
D456YD --> 456
455PN --> 455
Решение
Нет строковых констант, но вы можете сделать:
select translate
( mystring
, '0'||translate (mystring, 'x0123456789', 'x')
, '0'
)
from mytable;
Например:
select translate
( mystring
, '0'||translate (mystring, 'x0123456789', 'x')
, '0'
)
from
( select 'fdkhsd1237ehjsdf7623A@L:P' as mystring from dual);
TRANSLAT
--------
12377623
Если вы хотите делать это часто, вы можете обернуть это как функцию:
create function only_digits (mystring varchar2) return varchar2
is
begin
return
translate
( mystring
, '0'||translate (mystring, 'x0123456789', 'x')
, '0'
);
end;
/
Тогда:
SQL> select only_digits ('fdkhsd1237ehjsdf7623A@L:P') from dual;
ONLY_DIGITS('FDKHSD1237EHJSDF7623A@L:P')
-----------------------------------------------------------------
12377623
Другие советы
Вы можете проверить список предопределенных типов данных в Oracle здесь, но вы не найдете того, что ищете.
Чтобы извлечь номера строки, вы можете использовать некоторую комбинацию этих функций:
- К_НОМЕР, чтобы преобразовать строку в число.
- ЗАМЕНИТЬ, чтобы устранить вхождения.
- ПЕРЕВЕСТИ, для преобразования символов.
Если вы приведете более краткий пример, вам будет легче дать подробное решение.
Если вы можете использовать PL / SQL здесь, другой подход - написать свою собственную функцию сопоставления регулярных выражений.Одной из отправных точек является элегантный, очень миниатюрный механизм сопоставления регулярных выражений Роба Пайка в главе 1 из Красивый Код.Одно из упражнений для читателя - добавить классы персонажей.(Сначала вам нужно было бы перевести его 30 строк кода C на PL / SQL.)