Oracle строит классы символов строки - PullRequest
0 голосов
/ 14 июля 2009

Есть ли в Oracle встроенные строковые константы класса символов (цифры, буквы, буквенные, верхние, нижние и т. Д.)?

Моя настоящая цель - эффективно вернуть только цифры [0-9] из существующей строки.

К сожалению, мы все еще используем Oracle 9, поэтому регулярные выражения здесь не подходят.

Примеры Поле должно содержать от нуля до трех букв, 3 или 4 цифры, затем от нуля до двух букв. Я хочу извлечь цифры.

String    --> Result
ABC1234YY --> 1234
D456YD    --> 456
455PN     --> 455

Ответы [ 3 ]

1 голос
/ 14 июля 2009

Нет строковых констант, но вы можете сделать:

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
1 голос
/ 14 июля 2009

Если вы можете использовать PL / SQL здесь, другой подход - написать собственную функцию сопоставления регулярных выражений. Одной из отправных точек является элегантный, очень крошечный инструмент регулярных выражений Роба Пайка в главе 1 Beautiful Code . Одним из упражнений для читателя является добавление классов персонажей. (Сначала нужно перевести его 30 строк кода на C в PL / SQL.)

1 голос
/ 14 июля 2009

Вы можете проверить список предопределенных типов данных в Oracle здесь , но вы не найдете того, что ищете.

Для извлечения номеров строк вы можете использовать комбинацию этих функций:

Если вы предоставите более краткий пример, вам будет проще дать подробное решение.

...