Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Регулярные выражения в SQL.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
222.72 Кб
Скачать

http://www.sqlbooks.ru/default.aspx

http://www.sql-tutorial.ru/ru/book_predicate_like/page2.html

Спасибо. Я уже понял, что с помощью регулярных выражений в SQL мою задачу не решить. MySQL не осуществляет подстановку через регулярку, а лишь может возвращать значение истину или ложь, в зависимости от того, совпадает поле с регулярным выражением или нет. К сожалению, мне нужна была именно замена и именно с GROUP BY. Придется решать другим путем.

К сожалению, нормально эта тема изложена только на http://dev.mysql.com/doc/refman/5.0/en/regexp.html, пока не добрался туда, не понял.

Потому что where a like '%asd%fgh%ddd%' or a like '%asd%ddd%' or a like '%asd%fgh%' or a like '%fgh%ddd%'

Это не дело вообще

ну типа такого select `a` from `tt` where regexp(...) = 1

СУБД MYSQL

если мы хотим найти строку символов, содержащую 'Deborah', то могли бы написать следующий SQL-запрос.

SELECT text FROM my_text WHERE text LIKE '%Deborah%';

Этот запрос действительно возвратит всякую строку, которая содержит 'Deborah' в любом месте текста в пределах строки символов. Чтобы сделать быстро аналогичное сравнение с помощью регулярного выражения, можно выполнить следующий SQL-запрос, который содержит новую функцию REGEXP_LIKE.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deborah\');

Итак, зачем мы хотим использовать регулярные выражения вместо того, чтобы просто использовать сравнение LIKE, с которым мы очень хорошо знакомы? Главным образом, потому, что как только Вы начинаете задавать высокоуровневые вопросы о "сходстве" строки образцу, то, наиболее вероятно, закончите условием WHERE c многократными сравнениями 'OR' и 'LIKE', чтобы вытащить то, что Вы действительно ищете. С помощью регулярных выражений Вы можете в большинстве случаев написать только один образец сравнения. Возьмём предыдущий пример. Предположим теперь, что нам требуется найти в романе главный персонаж Deborah, которую также называют 'Debbie'. В этом случае мы можем изменить наше условие для поиска текста на LIKE '%Deb%', и тем самым решить проблему. Но что случится, в этом конкретном романе обсуждаются также финансовое состояние нашей девушки из высшего общества. Мы можем прекратить поиск, найдя предложения, которые содержат слова типа 'Debt', или 'Debutante'. Мы теперь имеем очень сложную проблему. Чтобы гарантировать, что мы найдём текст, имеющий непосредственное отношение к Деборе, мы должны использовать регулярное выражение. Вот SQL-запрос, который Вы должны выполнить. Теперь он находит все предложения, где в романе говорится о Деборе.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '\Deb(bie|orah)\');

Видно, что в пределах образца соответствия мы программируем варианты текста, содержащего 'Debbie' или альтернативу 'Deborah', с помощью опции (bie|orah) в выражении. Это - каноническая форма построения шаблона, по которому выполняется сравнение строки.

Другой сложный пример, с которым вы можете справиться только используя выражения, находит адреса электронной почты. Это можно быстро сделать с помощью следующего выражения. При этом Вы строите части адреса электронной почты перед знаком '@' и после него. Посмотрите внимательно на этот образец, поскольку он требует трёх разных частей адреса электронного адреса и учитывает присутствие '.', а так же как нижнего подчёркивания '_' в имени. Все эти символы вполне допустимы.

SELECT text FROM my_text

WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}');

Теперь, если Вы хотите искать только '.com' адреса электронной почты, то можно изменить SQL-код на следующий.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[A-Z0-9._%-]+@[A-Z0-9._%-]+\.com');

Другая часто вызывающая затруднения проблема - это выяснение того, имеется ли число в строке текста или проверка того, представляет ли собой число строка символов. Для нахождения строки, содержащей число, которое соответствует образцу с десятичной точкой, Вы могли бы использовать этот метод. Имея в виду, что числа, которые имеют десятичную точку, должны иметь действительное число после десятичной точки, я написал '+', чтобы указать одно или более чисел.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '[0-9]?\.[0-9]+');

Регулярные выражения являются мощным орудием, когда ищутся образцы текстов или проверяется соответствие определённому образцу, подобное телефонному номеру, адресу электронной почты, IP-адресу или почти любому образцу, который нуждается в проверке. Обратным вариантом является проверка недопустимых форматов и образцов символов. В нашем предыдущем примере мы могли бы легко разыскать текст, где 'Debbie' написано с ошибкой, например, как 'Debbbie' или 'Debie'.

Другая часто вызывающая затруднения проблема - это выяснение того, имеется ли число в строке текста или проверка того, представляет ли собой число строка символов. Для нахождения строки, содержащей число, которое соответствует образцу с десятичной точкой, Вы могли бы использовать этот метод. Имея в виду, что числа, которые имеют десятичную точку, должны иметь действительное число после десятичной точки, я написал '+', чтобы указать одно или более чисел.

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Debbbie)');

Чтобы получить имена, набранные тяжёлыми пальцами, где 'b', возможно, был набит более 3-х раз; мы можем использовать следующий запрос

SELECT text FROM my_text WHERE REGEXP_LIKE (text, '(Deb)(b){2,}');

Регулярные выражения поначалу могут показаться очень замысловатыми. Мне даже требуются некоторые усилия, чтобы вспомнить эти образцы, если я не использовал их какое-то время. Но после некоторых затрат времени на изучение их построения Вы будете вознаграждены, столкнувшись со сложными критериями поиска.

Итак, где же узнать, как строить регулярные выражения. Это действительно не столь трудно, как Вы могли бы подумать. Регулярные выражения всегда сопутствовали миру Unix, и поэтому есть много информации по ним в сети. Руководства Oracle включают несколько страниц, около 5, которые посвящены регулярным выражениям; поэтому лучше начать отсюда, а в особо тяжёлых случаям обращаться к сети. Вы можете смело довериться Yahoo, Google или любой другой вашей любимой поисковой машине в поиске руководств и вебсайтов, посвящённым исключительно регулярным выражениям.

Выражение

Синтаксис

Описание

Любой символ

.

Совпадает с любым одиночным символом, кроме символа новой строки.

Ноль или более

*

Совпадает с нулём или большим числом вхождений предыдущего выражения, создавая все возможные совпадения.

Один или более

+

Совпадает с одним и больше вхождений предыдущего выражения.

Начало строки

^

Совпадает с вхождением, только если оно находится в начале строки текста, в котором производится поиск.

Конец строки

$

Совпадает с вхождением, только если оно находится в конце строки текста, в котором производится поиск.

Начало слова

<

Совпадает с вхождением, только если оно является началом слова в тексте.

Конец слова

>

Совпадает с вхождением, только если оно является концом слова в тексте.

Символ новой строки

\n

Совпадает с символом новой строки, не зависящим от платформы. Вставляет символ новой строки в выражение замены.

Любой символ из набора

[]

Совпадает с любым из символов внутри квадратных скобок ([ ]). Чтобы указать диапазон символов, начальный и конечный символ следует вводить через тире (—), например: [a—z].

Любой символ, не входящий в набор

[^...]

Совпадает с любым символом, не перечисленным в наборе символов после символа ^.

Или

|

Совпадает с выражением до или после символа дизъюнкции (|). В основном используется в группах. Например, строка «(хвойный|лиственный) лес» совпадает со строками «хвойный лес» и «лиственный лес».

ESC

\

Совпадает с символом после обратной косой черты (\) в качестве литерала. Это позволяет искать символы, имеющие специальное значение в регулярных выражениях, таких как { или ^. Например, \^ осуществляет поиск символа ^.

Выражение-метка

{}

Совпадает со строкой, помеченной заключённым в фигурные скобки выражением.

Идентификатор C/C++

:i

Совпадает с выражением ([a-zA-Z_$][a-zA-Z0-9_$]*).

Строка в кавычках

:q

Совпадает с выражением (("[^"]*")|('[^']*')).

Пробел или символ табуляции

:b

Совпадает с пробелами или символами табуляции.

Целое число

:z

Совпадает с выражением ([0-9]+).

Выражение

Синтаксис

Описание

Минимум — ноль или больше

@

Совпадает с нулем или большим числом вхождений предыдущего выражения, совпадая с минимальным числом символов.

Минимум — один или больше

#

Совпадает с одним или большим числом вхождений предыдущего выражения, совпадая с минимальным числом символов.

Повтор n раз

^n

Совпадает с числом n вхождений предыдущего выражения. Например, [0-9]^4 совпадет с любым четырехзначным числом.

Группирование

()

Группирует вложенное выражение.

n-й помеченный текст

\n

В выражении Поиск и замена показывает, что текст должен совпадать с n-м выражением-меткой, где n — это число в диапазоне от 1 до 9.

В выражении Замена \0 вставляет текст совпадения целиком.

Выравнивание по правому краю

\(w,n)

В выражении Замена выравнивает по правому краю n-е выражение-метку в поле шириной, по крайней мере, w символов.

Выравнивание по левому краю

\(-w,n)

В выражении Замена выравнивает по левому краю n-е выражение-метку в поле шириной, по крайней мере, w символов.

Предотвращение совпадения

~(Х)

Предотвращает совпадение, когда X появляется в этом месте выражения. Например, «прав~(да)» совпадает со словами «правый» и «правота», но не со словом «правда».

Буквенно-цифровой символ

:a

Совпадает с выражением ([a-zA-Z0-9]).

Буква

:c

Совпадает с выражением ([a-zA-Z]).

Десятичная цифра

:d

Совпадает с выражением ([0-9]).

Шестнадцатеричная цифра

:h

Совпадает с выражением ([0-9a-fA-F]+).

Рациональное число

:n

Совпадает с выражением (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+)).

Строка букв

:w

Совпадает с выражением ([a-zA-Z]+).

ESC

\e

Код Юникода U+001B

Спецсимвол Bell

\g

Код Юникода U+0007

BACKSPACE

\h

Код Юникода U+0008

TAB

\t

Совпадает с символом табуляции, код Юникода U+0009.

Символьный формат Юникода

\x#### или \u####

Совпадает с символом, который соответствует значению #### в шестнадцатеричных цифрах в Юникоде. Символ, не входящий в основное многоязычное поле (т.е. суррогатный), можно указать с помощью элементов кода ISO 10646 или двух элементов кода Юникода, дающих значение суррогатной пары.

Выражение

Синтаксис

Описание

Буква в верхнем регистре

:Lu

Совпадает с одной заглавной буквой. Например, «:Luнига» совпадает со строкой «Книга», но не «книга».

Буква в нижнем регистре

:Ll

Совпадает с одной прописной буквой. Например, «:Llнига», наоборот, совпадает со строкой «книга», но не «Книга».

Заглавная буква

:Lt

Совпадает со строкой из одной заглавной и одной прописной буквы, например «Нж» или «Дз».

Буква-модификатор

:Lm

Совпадает со знаками пунктуации, например запятыми, знаками ударений, двойными штрихами, используемыми для обозначения модификации предыдущей буквы.

Другая буква

:Lo

Совпадает с другими буквами, например готическая буква «ahsa».

Десятичная цифра

:Nd

Совпадает с десятичными цифрами от 0 до 9 и их эквивалентами полной ширины.

Цифра, обозначаемая буквой

:Nl

Совпадает с цифрами, обозначаемыми при помощи букв, например с римскими цифрами и идеографическим нулем.

Другая цифра

:No

Совпадает с другими цифрами, например со старой курсивной единицей.

Открывающая пунктуация

:Ps

Совпадает с открывающей пунктуацией, например с открывающими круглыми или фигурными скобками.

Закрывающая пунктуация

:Pe

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

Открывающие кавычки

:Pi

Совпадает со знаком открывающих двойных кавычек.

Закрывающие кавычки

:Pf

Совпадает с одиночными кавычками или знаком закрывающих двойных кавычек.

Тире

:Pd

Совпадает со знаком тире.

Соединительная пунктуация

:Pc

Совпадает с символом подчеркивания или знаком выделения подчеркиванием.

Другая пунктуация

:Po

Совпадает с (,), ?, ", !, @, #, %, &, *, \, (:), (;), ', и /.

Пробел

:Zs

Совпадает с пробелами.

Разделитель строк

:Zl

Совпадает с символом U+2028 в кодировке Юникод.

Разделитель абзацев

:Zp

Совпадает с символом U+2029 в кодировке Юникод.

Знак, отличный от пробельного

:Mn

Совпадает со всеми знаками, отличными от пробельных.

Объединяющий знак

:Mc

Совпадает с объединяющими знаками.

Закрывающий знак

:Me

Совпадает с закрывающими знаками.

Математический символ

:Sm

Совпадает с +, =, ~, |, < и >.

Символ валют

:Sc

Совпадает со знаком $ и остальными символами валют.

Символ-модификатор

:Sk

Совпадает с символами-модификаторами, например двойным, одинарным диакритическим ударением и знаком долготы над гласными.

Другие символы

:So

Совпадает с другими символами, например знаком авторских прав, знаком абзаца и знаком градуса.

Другие управляющие символы

:Cc

Совпадает с концом строки.

Другие символы форматирования

:Cf

Совпадает с управляющими символами форматирования, например двусторонними управляющими символами.

Суррогат

:Cs

Совпадает с половиной суррогатной пары.

Символы личного пользования

:Co

Совпадает с символами из индивидуальной области.

Другие неприсвоенные символы

:Cn

Символы, не имеющие соответствия символам Юникода.

Выражение

Синтаксис

Описание

Буква

:Al

Совпадает с одним любым символом. Например, «:Alда» совпадает со словами «правда», «вода» и «сдача».

Число

:Nu

Совпадает с любым числом или цифрой.

Пунктуация

:Pu

Совпадает с любым знаком пунктуации, например ?, @, ' и т. д.

Пробельная область

:Wh

Совпадает со всеми типами пробелов, включая типографский и идеографический пробелы.

Двунаправленный текст

:Bi

Совпадает со всеми символами алфавитов с записью справа налево, например арабский или иврит.

Символы Хангула (Hangul)

:Ha

Совпадает с корейскими символами Хангуль и сочетающимися символами Джамос.

Хирагана

:Hi

Совпадает с символами хираганы.

Катакана

:Ka

Совпадает с символами катаканы.

Идеографические символы / символы Хань / символы Кандзи

:Id

Совпадает с идеографическими символами, например символами Хань и Кандзи

Предикат LIKE и регулярные выражения

Предикат LIKE в его стандартной редакции не поддерживает регулярных выражений, хотя ряд реализаций (в частности, Oracle) допускает их использование, расширяя возможности стандарта.

В SQL Server 2005/2008 использование регулярных выражений возможно через CLR, т.е. посредством написания хранимых процедур и функций.

Однако в Transact-SQL, помимо стандартных символов-шаблонов ("%" и "_"), существует ещё пара символов, которые делают этот предикат LIKE более гибким инструментом. Этими символами являются:

  • [ ] - одиночный символ из набора символов (например, [zxy]) или диапазона ([a-z]), указанных в квадратных скобках. При этом можно перечислить сразу несколько диапазонов (например, [0-9a-z]);

  • ^ - который с сочетании с квадратными скобками исключает из поискового образца символы из набора или диапазона.

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

SQL Server 2005

Регулярные выражения облегчают сопоставление шаблонов и извлечение данных

Дэвид Банистер

В статье рассматривается:

  • Эффективное составление запросов SQL с помощью регулярных выражений

  • Поддержка регулярных выражений в SQL Server 2005

  • Использование классов .NET Regex из SQL Server

  • Эффективное применение регулярных выражений в базе данных

Продукты и технологии: SQL Server 2005, .NET Framework

Загрузить исходный код для этой статьи:Regex2007_02.exe (154 KB) Просмотреть код в интерактивном режиме

Содержание

Определенные пользователем функции CLR Сопоставление шаблонов Извлечение данных Хранилище шаблонов Совпадения Извлечение данных при совпадениях Заключение

Несмотря на то что T-SQL является исключительно мощным языком обработки данных, он плохо приспособлен для анализа текста и манипуляций с ним. Попытки проведения анализа сколько-нибудь сложного текста с помощью встроенных строковых функций приводят к существенному утяжелению этих функций и сохраненных процедур, вследствие чего их становится трудно отлаживать и поддерживать. Но, может быть, существует более подходящий путь?

На самом деле гораздо более эффективное и элегантное решение предлагают регулярные выражения. Легко убедиться в том, как они могут быть полезны при сравнении текстов с целью идентификации записей, хотя при этом они способны на гораздо большее. Я покажу, каким образом можно решать разнообразные задачи, для которых средства SQL Server™ 2000 считались неудобными или неприменимыми, а теперь стали возможными с появлением SQL Server 2005, благодаря его поддержке хостинга среды CLR (common language runtime).

Регулярные выражения для SQL не новость. Oracle встроил регулярные выражения в базу данных 10g, и многие решения для баз данных с открытым исходным кодом также используют своего рода библиотеки регулярных выражений. По существу регулярные выражения могли бы использоваться и в более ранних версиях SQL Server, но механизм их обработки там был недостаточен.

С помощью сохраненной процедуры sp_OACreate может быть использован любой объект автоматического управления OLE с внедренными регулярными выражениями, однако сначала нужно создать объект COM, затем сделать, по крайней мере, один вызов IDispatch, а затем ликвидировать объект. Для большинства задач это было совершенно недостаточно и являлось причиной многих проблем, связанных с работоспособностью. Единственной альтернативой было создание расширенной сохраненной процедуры. Однако сегодня существует SQLCLR, определенная пользователем (user-defined function, UDF) функция CLR, которая позволяет создавать эффективный и менее подверженный ошибкам набор функций с помощью Microsoft® .NET Framework.

Определенные пользователем функции clr

Определенные пользователем функции CLR являются попросту статическими методами (общие функции в Visual Basic), определенными внутри сборки .NET. Чтобы использовать объекты SQLCLR, необходимо зарегистрировать сборку в SQL Server с помощью нового оператора CREATE ASSEMBLY, а затем создавать каждый объект, указывая на его исполнение в сборке. С целью поддержки создания определенных пользователем функций CLR применение оператора CREATE FUNCTION было расширено для функций. При использовании SQL Server Project среда разработки Visual Studio® 2005 для упрощения процесса берет на себя от имени пользователя все регистрационные процедуры. Этот тип проекта отличается от большинства проектов Visual Studio, поскольку при попытке отладки (или запуска без отладки) проект перекомпилируется и получающаяся сборка, как и все определенные в ней объекты SQLCLR, устанавливаются и регистрируются в SQL Server. Затем интегрированная среда разработки запускает тестовый сценарий, предназначенный для данного проекта. Для упрощения процесса отладки как в сценарии SQL, так и в .NET-коде пользователя могут быть установлены точки прерывания.

Добавление функции происходит практически так же, как и добавление нового класса к какому-либо другому типу проекта. Нужно просто добавить в проект новый элемент, а затем при появлении запроса выбрать User-Defined Function. К частичному классу, содержащему все функции пользователя, добавляется новый метод. Новый метод также будет иметь собственный атрибут SqlFunction. Он используется средой Visual Studio для создания SQL-операторов, необходимых при регистрации функции. Поля IsDeterministic, IsPrecise, DataAccess и SystemDataAccess атрибута SqlFunction также используются для различных целей SQL Server.

Сопоставление шаблонов

Определение соответствия строки шаблону представляет собой простейший вид использования регулярных выражений и, как видно из рис. 1, он легко реализуется.

Figure 1 Сопоставление строк

Копировать код

public static partial class UserDefinedFunctions

{

public static readonly RegexOptions Options =

RegexOptions.IgnorePatternWhitespace |

RegexOptions.Singleline;

[SqlFunction]

public static SqlBoolean RegexMatch(

SqlChars input, SqlString pattern)

{

Regex regex = new Regex( pattern.Value, Options );

return regex.IsMatch( new string( input.Value ) );

}

}

Сначала используется поле Options для сохранения параметров регулярного выражения применительно к функциям. В данном случае выбраны RegexOptions.SingleLine и RegexOptions.IgnorePatternWhitespace. Первый из них устанавливает однострочный режим, а второй исключает неизолированные пробелы из регулярного выражения и помечает комментарии значком "решетка". Другой параметр, которым, возможно, захочется воспользоваться после тщательного размышления и анализа, является RegexOption.Compiled. При использовании Compiled с тяжело обрабатываемыми выражениями, пока их количество не так велико, существенный рост эффективности будет налицо. Определенно должны компилироваться выражения, используемые многократно. Однако не следует использовать параметр Compiled с регулярными выражениями, которые эксплуатируются лишь изредка, поскольку он приводит к повышенным издержкам на автозагрузку и перегрузке памяти. У пользователя может возникнуть соблазн расширить мою функцию RegexMatch общего назначения еще одним параметром, определяющим, следует ли компилировать данное выражение; таким образом в каждом конкретном случае пользователь может решать, насколько оправданы потери эффективности вследствие введения этой дополнительной нагрузки.

После задания применяемых параметров RegexOptions определяется функция RegexMatch, где вместо типа данных SqlString используется SqlChars. Тип данных SqlString преобразуется в тип nvarchar(4,000), тогда как SqlChars преобразуется в тип nvarchar(max). Новая функциональная возможность задания максимального размера допускает увеличение строк до значений, превышающих предел SQL Server 2000, равный 8000 байт. Для большей гибкости nvarchar(max) в настоящей статье используется в как можно более обобщенном виде. Однако, если соответствующие строки содержат менее 4000 символов, эффективность при использовании nvarchar(4,000) может быть значительно выше. Поэтому сначала необходимо оценить конкретные потребности и программировать код с их учетом.

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

Копировать код

select dbo.RegexMatch( N'123-45-6789', N'^\d{3}-\d{2}-\d{4}$' )

Шаблоном в этой инструкции является простой тест на личный номер в системе страхования США. Установите точку прерывания для нового запроса, после чего начинайте отладку работы функции. Эта функция позволяет выполнять множество различных тестов, но здесь мы рассмотрим лишь некоторые особенности, которые большинство людей не принимает во внимание. Например, очень важно придерживаться соглашения о присвоении имен, действующего в пределах базы данных, а написание запроса для подтверждения того, что все сохраненные процедуры удовлетворяют нормативам данной организации, является затруднительным. Функция RegexMatch решает эту задачу гораздо проще. Например, так выполняет эту задачу следующий тест запроса:

Копировать код

select ROUTINE_NAME

from INFORMATION_SCHEMA.ROUTINES

where ROUTINE_TYPE = N'PROCEDURE'

and dbo.RegexMatch( ROUTINE_NAME,

N'^usp_(Insert|Update|Delete|Select)([A-Z][a-z]+)+$' ) = 0

Этот запрос проверяет, каждая ли сохраненная процедура имеет перед своим именем префикс "usp_", за которым следует "Insert", "Update", "Delete" или "Select". Он также проверяет, чтобы каждое слово в названии объекта начиналось с заглавной буквы. Сравните те четыре строки с этой сверхупрощенной версией, использующей только встроенные функции:

Копировать код

select ROUTINE_NAME

from INFORMATION_SCHEMA.ROUTINES

where ROUTINE_TYPE = N'PROCEDURE'

and ( LEN( ROUTINE_NAME ) < 11

or LEFT( ROUTINE_NAME, 4 ) <> N'usp_'

or SUBSTRING( ROUTINE_NAME, 5, 6 ) not in

( N'Insert', N'Update', N'Delete', N'Select' ) )

Даже несмотря на то, что этот запрос в большей степени является кодом, он, фактически, упускает несколько функций, присутствующих в версии с регулярными выражениями. Во-первых, он нечувствителен к регистру символов, так что использование сопоставлений внутри запроса на выполнение тестов может привести к неверным результатам. Во-вторых, он не выполняет некоторые тесты на фактическое имя объекта, содержащееся в имени процедуры. В-третьих, все четыре строки, тестируемые в запросе, имеют длину шесть символов, что позволило упростить код извлечением отдельной подстроки длиной шесть символов и использовать ее во всех допустимых операциях сравнения. Это не является проблемой в данном конкретном примере, поскольку все имена команд состоят из шести символов, но представьте себе стандарт, который задает более сложные глаголы, наподобие "Get", "List" или "Find". Этими глаголами легко манипулирует функция RegexMatch, поскольку они являются всего лишь дополнением к списку.

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

Копировать код

CREATE TABLE [Account]

(

[AccountNumber] nvarchar(20) CHECK (dbo.RegexMatch(

[AccountNumber], '^[A-Z]{3,5}\d{5}-\d{3}$' ) = 1),

[PhoneNumber] nchar(13) CHECK (dbo.RegexMatch(

[PhoneNumber], '^\(\d{3}\)\d{3}-\d{4}$' ) = 1),

[ZipCode] nvarchar(10) CHECK (dbo.RegexMatch(

[ZipCode], '^\d{5}(\-\d{4})?$' ) = 1)

)

Содержимое столбца AccountNumber проверяется на соответствие произвольной договоренности о том, оно должно начинаться с трех-пяти букв, за которыми следует пять цифр, затем тире и еще три цифры. Как телефонные номера, так и почтовые индексы, проверяются на соответствие стандартам США для форматов телефонных номеров и почтовых индексов. Функция RegexMatch предоставляет множество возможностей для SQL Server, однако, внедрение регулярных выражений в .NET, как будет показано далее, дает их гораздо больше.