Предикат LIKE в его стандартной редакции не поддерживает регулярных выражений, хотя ряд реализаций (в частности, Oracle) допускает их использование, расширяя возможности стандарта.
Однако в Transact-SQL, помимо стандартных символов-шаблонов ("%" и "_"), существует еще пара символов, которые делают этот предикат LIKE более гибким инструментом. Этими символами являются:
[ ] - одиночный символ из набора символов (например, [zxy]) или диапазона ([a-z]), указанных в квадратных скобках. При этом можно перечислить сразу несколько диапазонов (например, [0-9a-z]);
^ - который в сочетании с квадратными скобками исключает из поискового образца символы из набора или диапазона.
Поясним использование этих символов на примерах.
Консоль
Выполнить
SELECT * FROM
(
SELECT'5%' name UNIONALL
SELECT'55'UNIONALL
SELECT'5%%'UNIONALL
SELECT'3%%'UNIONALL
SELECT'a5%%'UNIONALL
SELECT'abc'UNIONALL
SELECT'abc 5% cde'UNIONALL
SELECT'5c2e'UNIONALL
SELECT'C2H5OH'UNIONALL
SELECT'C25OH'UNIONALL
SELECT'C54OH'
) x
/* 1 */
--WHERE name LIKE'5%' -- начинается с 5
/* 2 */
--WHERE name LIKE '5[%]' -- 5%
/* 3 */
--WHERE name LIKE '5|%' ESCAPE '|'-- 5%
/* 4 */
--WHERE name LIKE '%5|%%' ESCAPE '|' -- 5% в любом месте строки
/* 5 */
--WHERE name LIKE '[0-9][a-zA-Z]%' -- первая цифра, вторая буква
/* 6 */
--WHERE name LIKE '[a-z][0-9]%' -- первая буква, вторая цифра
/* 7 */
--WHERE name LIKE '[^0-9]%' -- начинается не на цифру.
/* 8 */
--WHERE name LIKE '%[02468]%' -- содержит четную цифру.
/* 9 */
--WHERE name LIKE '%[02468][13579]%' -- комбинация четная-нечетная.
В данном запросе генерируются некоторые данные, для поиска в которых используется предикат LIKE. Девять примеров - это соответственно 9 закомментированных предложений WHERE. Для проверки результатов выполнения запроса на сайте предварительно снимите комментарий с одной из строк, начинающихся с WHERE. Тем, кто не может использовать сайт, приведу здесь результаты выполнения этих примеров.
1. Все строки, которые начинаются с 5:
name
5%
55
5%%
5c2e
2. Поиск строки '5%'. Символ в скобках воспринимается как обычный единичный символ:
name
5%
3. Другое решение, аналогичное второму, но использующее ESCAPE-символ, указывающий, что знак % следует воспринимать как обычный символ.
4. Поиск подстроки '5%', находящейся в любом месте строки:
name
5%
5%%
a5%%
abc 5% cde
5. Поиск строки, у которой первый символ является цифрой, а второй - буквой:
name
5c2e
6. Поиск строки, у которой первый символ является буквой, а второй - цифрой. Вариант для регистронезависимого сравнения:
name
a5%%
C2H5OH
C25OH
C54OH
7. Поиск строки, которая начинается не с цифры:
name
a5%%
abc
abc 5% cde
C2H5OH
C25OH
C54OH
8. Поиск строки, которая содержит четную цифру:
name
5c2e
C2H5OH
C25OH
C54OH
9. Поиск строки, которая содержит подряд идущие четную и нечетную цифры: