Regexp_like функция

Синтаксис

Синтаксис функции Oracle/PLSQL REGEXP_INSTR:


REGEXP_INSTR( string, pattern ] ] ] ] )

Параметры или аргументы

string Строка для поиска. Строкой могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.

pattern

Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:

Значение Описание
^ Соответствует началу строки. При использовании match_parameter с m, соответствует началу строки в любом месте в пределах выражения.
$ Соответствует концу строки. При использовании match_parameter с m, соответствует концу строки в любом месте в пределах выражения.
* Соответствует нолю или более вхождений.
+ Соответствует одному или более вхождений.
? Соответствует нолю или одному вхождению.
. Соответствует любому символу, кроме NULL.
| Используется как «OR», чтобы указать более одной альтернативы.
Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке.
Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке.
( ) Используется для групповых выражений в качестве подвыражений.
{m} Соответствует m раз.
{m,} Соответствие как минимум m раз.
{m,n} Соответствие как минимум m раз, но не более n раз.
\n n представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n.
Соответствует одному сопоставлению элемента, который может быть более одного символа.
Соответствует классу символов.
Соответствует классу эквивалентности
\d Соответствует цифровому символу.
\D Соответствует не цифровому символу.
\w Соответствует текстовому символу.
\W Соответствует не текстовому символу.
\s Соответствует символу пробел.
\S Соответствует не символу пробел.
\A Соответствует началу строки или соответствует концу строки перед символом новой строки.
\Z Соответствует концу строки.
*? Соответствует предыдущему шаблону ноль или более вхождений.
+? Соответствует предыдущему шаблону один или более вхождений.
?? Соответствует предыдущему шаблону ноль или одному вхождению.
{n}? Соответствует предыдущему шаблону n раз.
{n,}? Соответствует предыдущему шаблону, по меньшей мере n раз.
{n,m}? Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз.

start_position Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.nth_appearance Необязательный. Это n-ое вхождение шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке.return_option Необязательный. Если return_option обозначен 0, то возвращается позиция первого символа входящего в шаблон. Если return_option обозначен 1, то возвращается позиция после символа входящего в шаблон. Если этот параметр опущен, он по умолчанию равен 0.

match_parameter Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_INSTR. Это может быть комбинацией следующих значений:

Значение Описание
‘c’ Выполняет чувствительное к регистру согласование.
‘i’ Выполняет не чувствительное к регистру согласование.
‘n’ Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы.
‘m’ Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке.
‘x’ Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ.

subexpression Необязательный. Используется, когда шаблон имеет подвыражения, и вы хотите указать, какое подвыражение в шаблоне является целью. Это целочисленное значение от 0 до 9, указывающее, что подвыражение соответствует шаблону.

Функция REGEXP_INSTR возвращает числовое значение. Если функция REGEXP_INSTR не обнаруживает никакого соответствия шаблону, она вернет 0.

Максимализм и минимализм

Концепции максимализма и минимализма играют важную роль при написании регулярных выражений. Допустим, из разделенного запятыми списка имен нужно извлечь только первое имя и следующую за ним запятую. Список, уже приводившийся ранее, выглядит так: 

names VARCHAR2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Jeff,Aaron';

Казалось бы, нужно искать серию символов, завершающуюся запятой:

.*, 

Давайте посмотрим, что из этого получится:

DECLARE
names VARCHAR2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Jeff,Aaron';
BEGIN
DBMS_OUTPUT.PUT_LINE( REGEXP_SUBSTR(names, '.*,') );
END; 

Результат выглядит так:

Anna,Matt,Joe,Nathan,Andrew,Jeff, 

Совсем не то. Что произошло? Дело в «жадности» регулярных выражений: для каждого элемента регулярного выражения подыскивается максимальное совпадение, состоящее из как можно большего количества символов. Когда мы с вами видим конструкцию: 

.*,

у нас появляется естественное желание остановиться у первой запятой и вернуть строку «,». Однако база данных пытается найти самую длинную серию символов, завершающуюся запятой; база данных останавливается не на первой запятой, а на последней.

В версии Oracle Database 10g Release 1, в которой впервые была представлена поддержка регулярных выражений, возможности решения проблем максимализма были весьма ограничены. Иногда проблему удавалось решить изменением формулировки регулярного выражения — например, для выделения первого имени с завершающей запятой можно использовать выражение . Однако в других ситуациях приходилось менять весь подход к решению, часто вплоть до применения совершенно других функций.

Начиная с Oracle Database 10g Release 2, проблема максимализма отчасти упростилась с введением минимальных квантификаторов (по образцу тех, которые поддерживаются в ). Добавляя вопросительный знак к квантификатору после точки, то есть превращая * в я ищу самую короткую последовательность символов перед запятой: 

DECLARE
names VARCHAR2(60) := 'Anna,Matt,Joe,Nathan,Andrew,Jeff,Aaron';
BEGIN
DBMS_OUTPUT.PUT_LINE( REGEXP_SUBSTR(names, '(.*?,)') );
END;

Теперь результат выглядит так, как и ожидалось:

Anna, 

Минимальные квантификаторы останавливаются на первом подходящем совпадении, не пытаясь захватить как можно больше символов.

Синтаксис

Синтаксис функции Oracle/PLSQL REGEXP_SUBSTR :

REGEXP_SUBSTR( string, pattern ] ] ] )

Параметры или аргументы

string Строка для поиска. Это могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.

pattern Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:

Значение Описание
^ Соответствует началу строки. При использовании match_parameter с m, соответствует началу строки в любом месте в пределах выражения.
$ Соответствует концу строки. При использовании match_parameter с m, соответствует концу строки в любом месте в пределах выражения.
* Соответствует нолю или более вхождений.
+ Соответствует одному или более вхождений.
? Соответствует нолю или одному вхождению.
. Соответствует любому символу, кроме NULL.
| Используется как «OR», чтобы указать более одной альтернативы.
Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке.
Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке.
( ) Используется для групповых выражений в качестве подвыражений.
{m} Соответствует m раз.
{m,} Соответствие как минимум m раз.
{m,n} Соответствие как минимум m раз, но не более n раз.
\n n представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n.
Соответствует одному сопоставлению элемента, который может быть более одного символа.
Соответствует классу символов.
Соответствует классу эквивалентности
\d Соответствует цифровому символу.
\D Соответствует не цифровому символу.
\w Соответствует текстовому символу.
\W Соответствует не текстовому символу.
\s Соответствует символу пробел.
\S Соответствует не символу пробел.
\A Соответствует началу строки или соответствует концу строки перед символом новой строки.
\Z Соответствует концу строки.
*? Соответствует предыдущему шаблону ноль или более вхождений.
+? Соответствует предыдущему шаблону один или более вхождений.
?? Соответствует предыдущему шаблону ноль или одному вхождению.
{n}? Соответствует предыдущему шаблону n раз.
{n,}? Соответствует предыдущему шаблону, по меньшей мере n раз.
{n,m}? Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз.

start_position Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.

nth_appearance Необязательный. Это n-й вид шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке. Если вы укажете 0 для этого параметра, все вхождения шаблона в строке будут заменены.match_parameter Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_REPLACE. Это может быть комбинацией следующих значений:

Значение Описание
‘c’ Выполняет чувствительное к регистру согласование.
‘i’ Выполняет не чувствительное к регистру согласование.
‘n’ Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы.
‘m’ Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке.
‘x’ Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ.

subexpression Необязательный. Используется, когда шаблон имеет подвыражения, и вы хотите указать, какое подвыражение в шаблоне является целью. Это целочисленное значение от 0 до 9, указывающее, что подвыражение соответствует шаблону.

  • Функция REGEXP_SUBSTR возвращает строковое значение.
  • Если функция REGEXP_SUBSTR не обнаруживает какого-либо вхождения шаблона, она возвращает NULL.

Пример сопоставления нескольких альтернатив.

Следующий пример, который мы рассмотрим, включает использование | pattern. | pattern используется как «ИЛИ», чтобы указать несколько альтернатив.

Например:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’) FROM dual;

—Результат: 3

1 2 3 4

SELECTREGEXP_COUNT(‘AeroSmith’,’a|e|i|o|u’)

FROMdual;   —Результат: 3

Этот пример вернет 3, потому что он подсчитывает количество гласных (a, e, i, o или u) в строке ‘AeroSmith’. Поскольку мы не указали значение match_parameter, функция REGEXP_COUNT будет выполнять поиск с учетом регистра, что означает, что ‘A’ в ‘AeroSmith’ не будет считаться.

Мы могли бы изменить наш запрос следующим образом, чтобы выполнить поиск без учета регистра следующим образом:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’, 1, ‘i’) FROM dual;

—Результат: 4

1 2 3 4

SELECTREGEXP_COUNT(‘AeroSmith’,’a|e|i|o|u’,1,’i’)

FROMdual;   —Результат: 4

Теперь, поскольку мы указали start_position = 1 и match_parameter = ‘i’, запрос вернет в качестве результата 4. На этот раз ‘A’ в ‘AeroSmith’ будет включена в счет.

Теперь давайте посмотрим, как мы будем использовать эту функцию со столбцом.

Итак, допустим, у нас есть таблица контактов со следующими данными:

contact_id last_name
1000 AeroSmith
2000 Joy
3000 Scorpions

Теперь давайте запустим следующий запрос:

Oracle PL/SQL

SELECT contact_id, last_name, REGEXP_COUNT (last_name, ‘a|e|i|o|u’, 1, ‘i’) AS total FROM contacts;

1 2

SELECTcontact_id,last_name,REGEXP_COUNT(last_name,’a|e|i|o|u’,1,’i’)AStotal

FROMcontacts;

Результаты, которые будут возвращены запросом:

contact_id last_name total
1000 AeroSmith 4
2000 Joy 1
3000 Scorpions 3

Слияние нескольких диапазонов

Предопределенные классы символов

регулярных выражениях

  • : Цифра. Эквивалентно .
  • : Нецифровой символ. Эквивалентно .
  • : Пробельный символ. Эквивалентно .
  • : Не пробельный символ. Эквивалентно .
  • : Словообразующий символ. Эквивалентно .
  • : Не словообразующий символ. Эквивалентно .
Разделители строк
Документация по SDK класса описывает метасимвол точки как предопределенный класс символов, соответствующий любому символу, кроме разделителей строк (одно- или двухсимвольные последовательности, отмечающие конец строки). Исключение составляет режим dotall (который мы обсудим далее), в котором точка соответствуют и разделителям строк. Класс различает следующие разделители строк:
  • cимвол возврата каретки ();
  • cимвол новой строки (символ протяжки бумаги на одну строку) ();
  • cимвол возврата каретки, за которым непосредственно следует символ новой строки ();
  • cимвол следующей строки ();
  • cимвол разделения строк ();
  • cимвол разделения абзацев ()

Граничные сопоставители

  • : Начало строки;
  • : Конец строки;
  • : Граница слова;
  • : Граница псевдослова;
  • : Начало текста;
  • : Конец предыдущего совпадения;
  • : Конец текста, не считая итогового разделителя строк (если таковой присутствует);
  • : Конец текста

Квантификаторы

  • Жадный квантификатор (, или ) предназначен для поиска самого длинного совпадения. Можно задать ? для поиска одного или менее вхождений , для поиска нуля или более вхождений , для поиска одного или более вхождений , для поиска вхождений , для поиска не менее (а возможно, и более) вхождений и для поиска не менее , но не более вхождений .
  • Ленивый квантификатор (, или ) предназначен для поиска самого короткого совпадения. Можно задать для поиска одного или менее вхождений , ? для поиска нуля или более вхождений , для поиска одного или более вхождений , для поиска вхождений , для поиска не менее (а возможно, и более) вхождений и для поиска не менее , но не более вхождений .
  • Сверхжадный квантификатор (, или ) аналогичен жадному, за исключением того, что сверхжадный квантификатор выполняет только одну попытку найти самое длинное совпадение, в то время как жадный может выполнять несколько попыток. Можно задать для поиска одного или менее вхождений , для поиска нуля или более вхождений , для поиска одного или более вхождений , для поиска вхождений , для поиска не менее (а возможно, и более) вхождений и для поиска не менее , но не более вхождений .

Вложенные флаговые выражения

  • : активирует нечувствительный к регистру поиск по шаблону. Например, при использовании команды последовательность символов соответствует шаблону . По умолчанию используется поиск по шаблону с учетом регистра.
  • : разрешает использование внутри шаблона пробельных символов и комментариев, начинающихся с метасимвола . Сопоставитель будет игнорировать и те, и другие. Например, для последовательность символов соответствует шаблону . По умолчанию, пробельные символы и комментарии запрещены, сопоставитель рассматривает их как символы, участвующие в поиске.
  • : активирует режим dotall, в котором метасимвол точки соответствует разделителям строк, помимо любого другого символа. Например, при команде будет найден символ новой строки. По умолчанию используется противоположный dotall режим: разделители строк не будут находиться. Например, при команде символ новой строки найден не будет.
  • : активирует многострочный режим, при котором соответствует началу, а – концу каждой строки. Например, находит во входном тексте обе последовательности . По умолчанию используется однострочный режим: соответствует началу всего входного текста, а — его концу. Например, возвращает ответ об отсутствии совпадений.
  • : активирует выравнивание регистра с учетом Unicode. Этот флаг, при совместном использовании с , позволяет осуществлять поиск по шаблону без учета регистра в соответствии со стандартом Unicode. Настройка по умолчанию — поиск с учетом регистра и только по символам из набора US-ASCII.
  • : активирует режим строк в стиле Unix, при котором сопоставитель распознает в контексте метасимволов , и только разделитель строк . По умолчанию используется режим строк в стиле не-Unix: сопоставитель распознает в контексте вышеупомянутых метасимволов все разделители строк.
Указание нескольких вложенных флаговых выражений
Существует возможность указания нескольких вложенных флаговых выражений в регулярном выражении путем или расположения их бок о бок (), или размещения последовательно определяющих их букв ().

Соединения (джойны)

Теперь мы хотим увидеть названия (не обязательно уникальные) всех книг Дэна Брауна, которые были взяты из библиотеки, и когда эти книги нужно вернуть:

Результат:

Title Return Date
The Lost Symbol 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
The Lost Symbol 2016-04-19 00:00:00

По большей части запрос похож на предыдущий за исключением секции . Это означает, что мы запрашиваем данные из другой таблицы. Мы не обращаемся ни к таблице “books”, ни к таблице “borrowings”. Вместо этого мы обращаемся к новой таблице, которая создалась соединением этих двух таблиц.

— это, считай, новая таблица, которая была сформирована комбинированием всех записей из таблиц «books» и «borrowings», в которых значения совпадают. Результатом такого слияния будет:

А потом мы делаем запрос к этой таблице так же, как в примере выше. Это значит, что при соединении таблиц нужно заботиться только о том, как провести это соединение. А потом запрос становится таким же понятным, как в случае с «простым запросом» из пункта 3.

Давайте попробуем чуть более сложное соединение с двумя таблицами.

Теперь мы хотим получить имена и фамилии людей, которые взяли из библиотеки книги автора “Dan Brown”.

На этот раз давайте пойдем снизу вверх:

Шаг Step 1 — откуда берем данные? Чтобы получить нужный нам результат, нужно соединить таблицы “member” и “books” с таблицей “borrowings”. Секция JOIN будет выглядеть так:

Шаг 2 — какие данные показываем? Нас интересуют только те данные, где автор книги — “Dan Brown”

Шаг 3 — как показываем данные? Теперь, когда данные получены, нужно просто вывести имя и фамилию тех, кто взял книги:

Супер! Осталось лишь объединить три составные части и сделать нужный нам запрос:

Что даст нам:

First Name Last Name
Mike Willis
Ellen Horton
Ellen Horton

Отлично! Но имена повторяются (они не уникальны). Мы скоро это исправим.

5. Агрегирование

Грубо говоря, агрегирования нужны для конвертации нескольких строк в одну. При этом, во время агрегирования для разных колонок используется разная логика.

Давайте продолжим наш пример, в котором появляются повторяющиеся имена. Видно, что Ellen Horton взяла больше одной книги, но это не самый лучший способ показать эту информацию. Можно сделать другой запрос:

Что даст нам нужный результат:

First Name Last Name Number of books borrowed
Mike Willis 1
Ellen Horton 2

Почти все агрегации идут вместе с выражением . Эта штука превращает таблицу, которую можно было бы получить запросом, в группы таблиц. Каждая группа соответствует уникальному значению (или группе значений) колонки, которую мы указали в . В нашем примере мы конвертируем результат из прошлого упражнения в группу строк. Мы также проводим агрегирование с , которая конвертирует несколько строк в целое значение (в нашем случае это количество строк). Потом это значение приписывается каждой группе.

Каждая строка в результате представляет собой результат агрегирования каждой группы.

Можно прийти к логическому выводу, что все поля в результате должны быть или указаны в , или по ним должно производиться агрегирование. Потому что все другие поля могут отличаться друг от друга в разных строках, и если выбирать их ‘ом, то непонятно, какие из возможных значений нужно брать.

В примере выше функция обрабатывала все строки (так как мы считали количество строк). Другие функции вроде или обрабатывают только указанные строки. Например, если мы хотим узнать количество книг, написанных каждым автором, то нужен такой запрос:

Результат:

author sum
Robin Sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Здесь функция обрабатывает только колонку и считает сумму всех значений в каждой группе.

6. Подзапросы

Подзапросы это обычные SQL-запросы, встроенные в более крупные запросы. Они делятся на три вида по типу возвращаемого результата.

Синтаксис для MySQL

Следующая инструкция SQL определяет, что столбец «Personid», который должен быть полем первичного ключа с автоматическим приращением в поле первичного ключа в таблице «Persons»:


CREATE TABLE Persons (     Personid int NOT NULL AUTO_INCREMENT,     LastName varchar(255) NOT NULL,     FirstName varchar(255),     Age int,     PRIMARY KEY (Personid) );

MySQL использует ключевое слово AUTO_INCREMENT для выполнения функции автоматического приращения.

По умолчанию начальное значение для AUTO_INCREMENT равно 1, и оно будет увеличиваться на 1 для каждой новой записи.

Чтобы последовательность AUTO_INCREMENT начиналась с другого значения, используйте следующую инструкцию SQL:

ALTER TABLE Persons AUTO_INCREMENT=100;

Чтобы вставить новую запись в таблицу «Persons», нам не нужно будет указывать значение для столбца «Personid» (уникальное значение будет добавлено автоматически):

INSERT INTO Persons (FirstName,LastName) VALUES (‘Lars’,’Monsen’);

Приведенная выше инструкция SQL вставит новую запись в таблицу «Persons». Столбцу «Personid» будет присваивается уникальное значение. Столбец «FirstName» будет иметь значение «Lars», а столбец «LastName»- «Monsen».

SQL References

SQL Keywords ADD ADD CONSTRAINT ALTER ALTER COLUMN ALTER TABLE ALL AND ANY AS ASC BACKUP DATABASE BETWEEN CASE CHECK COLUMN CONSTRAINT CREATE CREATE DATABASE CREATE INDEX CREATE OR REPLACE VIEW CREATE TABLE CREATE PROCEDURE CREATE UNIQUE INDEX CREATE VIEW DATABASE DEFAULT DELETE DESC DISTINCT DROP DROP COLUMN DROP CONSTRAINT DROP DATABASE DROP DEFAULT DROP INDEX DROP TABLE DROP VIEW EXEC EXISTS FOREIGN KEY FROM FULL OUTER JOIN GROUP BY HAVING IN INDEX INNER JOIN INSERT INTO INSERT INTO SELECT IS NULL IS NOT NULL JOIN LEFT JOIN LIKE LIMIT NOT NOT NULL OR ORDER BY OUTER JOIN PRIMARY KEY PROCEDURE RIGHT JOIN ROWNUM SELECT SELECT DISTINCT SELECT INTO SELECT TOP SET TABLE TOP TRUNCATE TABLE UNION UNION ALL UNIQUE UPDATE VALUES VIEW WHERE

MySQL Functions String Functions ASCII CHAR_LENGTH CHARACTER_LENGTH CONCAT CONCAT_WS FIELD FIND_IN_SET FORMAT INSERT INSTR LCASE LEFT LENGTH LOCATE LOWER LPAD LTRIM MID POSITION REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SPACE STRCMP SUBSTR SUBSTRING SUBSTRING_INDEX TRIM UCASE UPPER

Numeric Functions ABS ACOS ASIN ATAN ATAN2 AVG CEIL CEILING COS COT COUNT DEGREES DIV EXP FLOOR GREATEST LEAST LN LOG LOG10 LOG2 MAX MIN MOD PI POW POWER RADIANS RAND ROUND SIGN SIN SQRT SUM TAN TRUNCATE

Date Functions ADDDATE ADDTIME CURDATE CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURTIME DATE DATEDIFF DATE_ADD DATE_FORMAT DATE_SUB DAY DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR EXTRACT FROM_DAYS HOUR LAST_DAY LOCALTIME LOCALTIMESTAMP MAKEDATE MAKETIME MICROSECOND MINUTE MONTH MONTHNAME NOW PERIOD_ADD PERIOD_DIFF QUARTER SECOND SEC_TO_TIME STR_TO_DATE SUBDATE SUBTIME SYSDATE TIME TIME_FORMAT TIME_TO_SEC TIMEDIFF TIMESTAMP TO_DAYS WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK

Advanced Functions BIN BINARY CASE CAST COALESCE CONNECTION_ID CONV CONVERT CURRENT_USER DATABASE IF IFNULL ISNULL LAST_INSERT_ID NULLIF SESSION_USER SYSTEM_USER USER VERSION

SQL Server Functions String Functions ASCII CHAR CHARINDEX CONCAT Concat with + CONCAT_WS DATALENGTH DIFFERENCE FORMAT LEFT LEN LOWER LTRIM NCHAR PATINDEX QUOTENAME REPLACE REPLICATE REVERSE RIGHT RTRIM SOUNDEX SPACE STR STUFF SUBSTRING TRANSLATE TRIM UNICODE UPPER

Numeric Functions ABS ACOS ASIN ATAN ATN2 AVG CEILING COUNT COS COT DEGREES EXP FLOOR LOG LOG10 MAX MIN PI POWER RADIANS RAND ROUND SIGN SIN SQRT SQUARE SUM TAN

Date Functions CURRENT_TIMESTAMP DATEADD DATEDIFF DATEFROMPARTS DATENAME DATEPART DAY GETDATE GETUTCDATE ISDATE MONTH SYSDATETIME YEAR

Advanced Functions CAST COALESCE CONVERT CURRENT_USER IIF ISNULL ISNUMERIC NULLIF SESSION_USER SESSIONPROPERTY SYSTEM_USER USER_NAME

MS Access Functions String Functions Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase

Numeric Functions Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val

Date Functions Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year

Other Functions CurrentUser Environ IsDate IsNull IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref

Пример сопоставления несколько альтернатив.

Следующий пример, который мы рассмотрим, включает использование | шаблон. | шаблон используется как «ИЛИ», чтобы указать несколько альтернатив. Например:

Oracle PL/SQL

SELECT REGEXP_INSTR (‘AeroSmith’, ‘a|e|i|o|u’) FROM dual;

—Результат: 2

1 2 3

SELECTREGEXP_INSTR(‘AeroSmith’,’a|e|i|o|u’)FROMdual;   —Результат: 2

Этот пример вернет 2, потому что он ищет первую гласную (a, e, i, o или u) в строке. Поскольку мы не указали значение match_parameter, функция REGEXP_INSTR выполнит поиск с учетом регистра, что означает, что символ ‘A’ в ‘AeroSmith’ не будет сопоставлен.

Мы могли бы изменить наш запрос, чтобы выполнить поиск без учета регистра следующим образом:

Oracle PL/SQL

SELECT REGEXP_INSTR (‘AeroSmith’, ‘a|e|i|o|u’, 1, 1, 0, ‘i’) FROM dual;

—Результат: 1

1 2 3

SELECTREGEXP_INSTR(‘AeroSmith’,’a|e|i|o|u’,1,1,0,’i’)FROMdual;   —Результат: 1

Теперь, поскольку мы предоставили match_parameter = ‘i’, запрос вернет в качестве результата 1. На этот раз ‘A’ в ‘AeroSmith’ будет сопоставляться.

Рассмотрим, как вы будете использовать эту функцию со столбцом.

Итак, допустим, у нас есть таблица contact со следующими данными:

contact_id last_name
1000 AeroSmith
2000 Joy
3000 Scorpions

Теперь давайте запустим следующий запрос:

Oracle PL/SQL

SELECT contact_id, last_name, REGEXP_INSTR (last_name, ‘a|e|i|o|u’, 1, 1, 0, ‘i’) AS first_occurrence FROM contacts;

1 2

SELECTcontact_id,last_name,REGEXP_INSTR(last_name,’a|e|i|o|u’,1,1,0,’i’)ASfirst_occurrence

FROMcontacts;

Результаты, которые будут возвращены запросом:

contact_id last_name first_occurrence
1000 AeroSmith 1
2000 Joy 2
3000 Scorpions 3

SQL Учебник

SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии

5 ответов

2

Я начну, сказав, что это не очень хороший способ сделать это, и настоятельно призываю вас найти другой способ сделать это, предпочтительно пометить его правильно там, где сделаны заявления, чтобы вы не закончили в этой ситуации.

При этом SQL требует, чтобы он начинался с одного из следующих: , , , или . Он также требует, чтобы вход заканчивался на .

Мы можем использовать это, чтобы захватить все последовательности, соответствующие SQL, следующим образом:

В группе 1 теперь выполняется операционное слово, если вы хотите отфильтровать действительный SQL на или .

Смотрите регулярное выражение в действии, а также пещеру здесь:

21 май 2013, в 13:08 Поделиться 1

Вы можете сопоставить его «правильно», если точка с запятой является последним символом без пробела в этой строке.

21 май 2013, в 12:05 Поделиться

SQL достаточно сложна, что вам понадобится контекст для поиска всех операторов, что означает, что вы не можете сделать это с помощью регулярного выражения.

Например:

(пример получен из http://www.sql-tutorial.com/sql-nested-queries-sql-tutorial/). Вложенные запросы могут вставляться несколько раз, начинать с разных значений и т.д. Если вы могли бы написать регулярное выражение для интересующего вас подмножества, оно было бы нечитаемым.

ANTLR имеет грамматику SQL 2003 (Я не пробовал).


21 май 2013, в 16:22 Поделиться

должен работать. Это расширит шаблон, чтобы он соответствовал символам новой строки. Он должен иметь возможность прокручивать и находить все ваши SQL.

Глядя на приведенный вами пример, он будет соответствовать вашим командам до . Вы можете увидеть пример, используемый для тестирования здесь.

21 май 2013, в 13:07 Поделиться

Если вы имеете дело с языком, создайте лексер, который символизирует вашу строку. Используйте JFlex, который является генератором лексического анализатора. Он генерирует класс Java, который разбивает строку на токены на основе грамматики, заданной в специальном файле. Возьмите соответствующие правила грамматики из этот файл.

Анализ — это отдельный процесс, чем токенизация (или лексический анализ). Возможно, вы захотите использовать генератор парсера после лексического анализа, если лексического анализа недостаточно.

21 май 2013, в 11:44 Поделиться

Ещё вопросы

  • 2Regex, чтобы определить, является ли строка одним повторяющимся символом
  • 2Заменить все символы между регулярными выражениями
  • 2Как изменить метод доступа метода с помощью регулярных выражений
  • 2Регулярное выражение: как заменить строку на n вхождений подстроки
  • Получить тег href из HTML
  • 2Обнаружить недопустимые символы XML
  • 2Пустая карта генерируется при преобразовании буквенно-цифровой строки в карту чисел и строк
  • 2Ошибка при использовании проверки Esapi
  • 2Как я могу сопоставить конкретный формат ввода с использованием java.util.regex в Java?
  • 2Переписать регулярное выражение без ‘\ K’

Example 2: Filter results for description with first character A and second character L

In the previous example, we filtered results for starting character A, or L. Suppose we want starting characters of descriptions AL. We can use T-SQL RegEx % in the Like operator.

1 2 3

SELECTDescription

FROMAdventureWorks.Production.ProductDescription

whereDescriptionlike’%’

In the output, you can we get only records with first character A and second characters L.

We can specify multiple characters as well to filter records. The following query gives results for starting characters together:

1 2 3

SELECTDescription

FROMAdventureWorks.Production.ProductDescription

whereDescriptionlike’%’

Пример совпадение на нескольких альтернативах

Давайте начнем с рассмотрения того, как использовать шаблон | оde> с функцией REGEXP_SUBSTR в MariaDB. Например:

PgSQL

SELECT REGEXP_SUBSTR (‘Ball Point Pen’,’P(a|e|i)n’));

—Результат: ‘Pen’

SELECT REGEXP_SUBSTR (‘Eggs and pancakes’,’P(a|e|i)n’);

—Результат: ‘pan’

1 2 3 4 5 6 7

SELECTREGEXP_SUBSTR(‘Ball Point Pen’,’P(a|e|i)n’));   —Результат: ‘Pen’  

SELECTREGEXP_SUBSTR(‘Eggs and pancakes’,’P(a|e|i)n’);   —Результат: ‘pan’

Эти примеры REGEXP_SUBSTR будут возвращать значения, такие как Pan, Pen или Pin. Шаблон | оde> говорит нам искать букву ‘a’, ‘e’ или ‘i’; между буквами ‘P’ и ‘n’. Функция REGEXP_SUBSTR выполняет поиск без учета регистра, поэтому не имеет значения, в каком регистре буквы находятся в строке.

Поиск с учетом регистра

Если мы хотим выполнить поиск с учетом регистра, нам нужно изменить нашу функцию REGEXP_SUBSTR для использования двоичной строки. Это можно сделать одним из двух способов.

PgSQL

SELECT REGEXP_SUBSTR (BINARY ‘Eggs and pancakes’, ‘P(a|e|i)n’); —Результат: NULL

1 2 3

SELECTREGEXP_SUBSTR(BINARY’Eggs and pancakes’,’P(a|e|i)n’);

—Результат: NULL

Или

PgSQL

SELECT REGEXP_SUBSTR (‘Eggs and pancakes’ COLLATE utf8_bin, ‘P(a|e|i)n’);

—Результат: NULL

1 2 3

SELECTREGEXP_SUBSTR(‘Eggs and pancakes’COLLATEutf8_bin,’P(a|e|i)n’);  

—Результат: NULL

В первом примере мы использовали ключевое слово BINARY, чтобы преобразовать нашу строку в двоичную строку. Во втором примере мы использовали COLLATE для преобразования нашей строки в двоичную строку. Поскольку мы выполняем поиск с учетом регистра, шаблон не совпадает на ‘pancakes’, потому что ему требуется заглавная буква ‘P’, поэтому функция REGEXP_SUBSTR будет возвращать NULL.

Поиск столбцов таблицы

Теперь давайте покажем, как использовать функцию REGEXP_SUBSTR со столбцом таблицы: Допустим, у нас есть таблица contact со следующими данными:

1000 Андерсон

2000 Смит

3000 Джонсон

оdy>

Теперь запустим следующий запрос:

PgSQL

SELECT cоntact_id, last_name, REGEXP_SUBSTR (last_name, ‘a|e|i|o|u’) AS «First Vowel» FROM cоntacts;

1 2

SELECTcоntact_id,last_name,REGEXP_SUBSTR(last_name,’a|e|i|o|u’)AS»First Vowel»

FROMcоntacts;

Это результаты, которые будут возвращены запросом:

1000 Андерсон A

2000 Смит и

3000 Джонсон о

оdy>


С этим читают