В Oracle Database 11g и 12c предлагается поддержка для регулярных выражений, которые можно использовать в виде части SQL-операторов. Регулярные выражения позволяют применять для манипуляций со строками или выполнения поиска специальные операции.
Раньше разработчикам приходилось применять в своих выражениях для выполнения поиска операции вроде LIKE, REPLACE
и SUBSTR
. Однако при необходимости в реализации сложных типов поиска эти операции вынуждали их писать довольно длинные блоки кода SQL и PL/SQL. Oracle Database 11g теперь значительно облегчает эту задачу, позволяя использовать для выполнения сложных операций поиска и манипулирования строками регулярные выражения.
На заметку! Функциональные возможности регулярных выражений в Oracle соответствуют популярным стандартам POSIX.
В целом регулярное выражение предусматривает поиск в символьных строках определенных образцов. Символьная строка может относиться к типу CHAR, VARCHAR2
, NCHAR
или NVARCHAR2
, а регулярное выражение — содержать одну из следующих функций:
REGEXP_LIKE
REGEXP_REPLACE
REGEXP_INSTRING
REGEXP_SUBSTRING
Функция REGEXP_LIKE
вычисляет строки с использованием указанного набора символов. Она ищет в строке образец, указанный в параметре SOURCE_STRING
. Переменная PATTERN
представляет настоящее регулярное выражение, которое и является искомым образцом. Обычно регулярное выражение представляет собой текстовый литерал и может относиться к типу CHAR, VARCHAR2, NCHAR
или NVARCHAR2
и достигать максимум 512 байт в длину. При желании может задаваться необязательный параметр сопоставления для изменения режима сопоставления. Например, параметр i
указывает, что сопоставление с образцом должно выполняться без учета регистра, а параметр c
— наоборот, с учетом регистра.
Ниже показан общий синтаксис функции REGEXP_LIKE
:
REGEXP_LIKE(исходная_строка, образец [, параметр_сопоставления])
Для манипулирования строками применяются встроенные функции REGEXP_INSTR, REGEXP_REPLACE
и REGEXP_SUBSTR
. Эти функции на самом деле являются расширениями обычных SQL-функций INSTR, REPLACE
и SUBSTR
.
В коде регулярных выражений могут применяться и такие типичные для программирования в UNIX и Perl символы, как точка (.), звездочка (*), знак вставки (^) и знак доллара ($
). Знак вставки (^), например, указывает Oracle, что следующие за ним символы должны находиться в начале строки, а знак доллара ($
) — что следующий за ним символ или ряд символов должны быть расположены в конце строки. Ниже приведен пример, в котором функция REGEXP_LIKE
используется для извлечения всех имен, в которых содержатся указанные гласные:
SQL> SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i'); LAST_NAME ----------- Freedman Greenberg Khoo Gee Lee . . . SQL>
Ниже приведен еще один пример, в котором функция REGEXP_LIKE
применяется для быстрого нахождения сотрудников, которые были наняты на работу в период с 2000 по 2008 гг.
SQL> SELECT emp_name, salary, 2 TO_CHAR(hire_date,'yyyy') year_of_hire 3 FROM emp 4* WHERE REGEXP_LIKE (TO_CHAR (hire_date, 'yyyy'), '^200[0-8]$'); LAST_NAME FIRST_NAME SALARY YEAR ---------- ---------- --------- ---- Austin David 4800 2007 Chen John 8200 2007 Alapati Shannon 7700 2007 Baida Shelli 2900 2007 Tobias Sigal 2800 2007 Weiss Matthew 8000 2007