LIKE: примеры (SQL)
LIKE(match_expression [NOT] LIKE pattern): BooleanОписание функции LIKE
Функция LIKE в MS SQL Server предназначена для сопоставления строк с шаблоном. Она часто применяется в условиях WHERE операторов SELECT, UPDATE или DELETE для фильтрации данных.
Синтаксис функции:
expression LIKE pattern [ESCAPE escape_character]
Аргументы:
- expression – строковое выражение, которое проверяется на соответствие шаблону. Это может быть имя столбца, переменная или результат другой функции.
- pattern – шаблон для сравнения. Может включать обычные символы и специальные подстановочные знаки:
- % – соответствует любой последовательности из нуля или более символов.
- _ – соответствует ровно одному любому символу.
- [список] – соответствует одному символу из указанного в скобках списка или диапазона (например, [a-f] или [абв]).
- [^список] – соответствует одному символу, не входящему в указанный список или диапазон.
- escape_character – необязательный символ для поиска самих подстановочных знаков в тексте. Позволяет экранировать символы %,_ , [ и ].
Возвращаемое значение:
- Результатом является логическое значение TRUE, если выражение соответствует шаблону.
- Если соответствия нет, возвращается FALSE.
- Если хотя бы один из аргументов (expression или pattern) равен NULL, функция возвращает NULL.
Работа функции зависит от параметров сортировки (collation) базы данных, что определяет чувствительность к регистру.
Простые примеры
Пример 1: Поиск строк, начинающихся с заданной подстроки.
SELECT 'Стол' AS Item WHERE 'Стол' LIKE 'Ст%';Item ----- Стол
Пример 2: Использование символа _ для одного произвольного символа.
SELECT 'Кот' AS Word WHERE 'Кот' LIKE 'К_т';Word ---- Кот
Пример 3: Использование набора символов [].
SELECT 'Бар' AS Name WHERE 'Бар' LIKE '[А-Я]ар';Name ---- Бар
Пример 4: Использование отрицания в наборе [^].
SELECT 'сад' AS Name WHERE 'сад' LIKE '[^А-Я]%';Name ---- сад
Пример 5: Поиск символа % с помощью ESCAPE.
SELECT 'Скидка 50%' AS Text WHERE 'Скидка 50%' LIKE '%50!%%' ESCAPE '!';Text ---------- Скидка 50%
Сравнение с другими функциями MS SQL
CHARINDEX и PATINDEX могут решать схожие задачи. CHARINDEX ищет точную подстроку и возвращает её позицию. PATINDEX поддерживает те же шаблоны, что и LIKE, и также возвращает позицию первого вхождения.
SELECT PATINDEX('%[0-9]%', 'Заказ №123');8
CHARINDEX работает быстрее для точного поиска, а LIKE и PATINDEX необходимы для поиска по шаблону. PATINDEX удобно использовать, когда требуется получить числовую позицию найденного фрагмента.
Аналоги в других СУБД и языках
MySQL: оператор LIKE работает идентично. Дополнительно существует оператор REGEXP для сложных регулярных выражений.
SELECT 'Apple' REGEXP '^A';1
Oracle: также поддерживает LIKE. Для регулярных выражений есть функции REGEXP_LIKE, REGEXP_INSTR.
SELECT REGEXP_LIKE('Строка', '^Стр') FROM dual;TRUE
PostgreSQL: помимо LIKE, есть оператор SIMILAR TO, который использует шаблоны в стиле SQL, и оператор ~ для регулярных выражений POSIX.
SELECT 'Text' SIMILAR TO 'T%';t
SQLite: поддерживает LIKE. Для поиска с учётом регистра часто используется GLOB, который имеет другой синтаксис подстановки (* и ?).
SELECT 'file.txt' GLOB '*.txt';1
Sybase ASE: синтаксис LIKE практически идентичен MS SQL.
Распространённые ошибки
Ошибка 1: Неправильный учёт регистра из-за параметров сортировки. Если база данных имеет регистронезависимую сортировку, условие LIKE 'a%' найдет и 'Apple', и 'apple'.
-- При сортировке Cyrillic_General_CI_AS:
SELECT 'Апельсин' WHERE 'Апельсин' LIKE 'ап%'; -- Может вернуть строкуОшибка 2: Невнимательное экранирование специальных символов. Без ESCAPE символы % и _ интерпретируются как подстановочные знаки.
-- Неправильно, ищет строки, заканчивающиеся на '50':
SELECT * FROM Sales WHERE Note LIKE 'Скидка 50%';
-- Правильно, если нужно найти строку с символом '%':
SELECT * FROM Sales WHERE Note LIKE 'Скидка 50!%' ESCAPE '!';Ошибка 3: Использование LIKE с типами данных, отличными от строковых. Неявное преобразование может привести к непредсказуемым результатам.
-- Число будет неявно преобразовано в строку:
SELECT * FROM Products WHERE ProductID LIKE '12%'; -- Найдет ID 12, 120, 125 и т.д.История изменений
В последних версиях Microsoft SQL Server (начиная с SQL Server 2012) функция LIKE не претерпела значительных синтаксических изменений. Основные улучшения касаются оптимизации производительности при использовании определённых шаблонов (например, начинающихся с конкретного символа, а не с подстановочного знака) в сочетании с новыми индексами columnstore. Семантика работы функции остаётся стабильной для обеспечения обратной совместимости.
Сложные и специальные примеры
Пример 1: Поиск адресов электронной почты в текстовом поле.
SELECT Comments FROM Feedback WHERE Comments LIKE '%[A-Za-z0-9._%-]%@[A-Za-z0-9.-]%.[A-Za-z][A-Za-z]%';Comments ------------------------ Связь: user@example.com
Пример 2: Фильтрация по шаблону с переменной, содержащей подстановочные знаки.
DECLARE @mask NVARCHAR(20) = 'Report[_]202[0-9]%';
SELECT Name FROM Files WHERE Name LIKE @mask;Name -------------- Report_2021.xlsx Report_2020.pdf
Пример 3: Использование LIKE в CHECK-ограничении для валидации формата данных.
ALTER TABLE Employees ADD CONSTRAINT CK_Phone CHECK (Phone LIKE '+7([0-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]');Пример 4: Комбинирование NOT LIKE с другими условиями для исключения данных.
SELECT LogMessage FROM AppLog WHERE LogMessage NOT LIKE '%DEBUG%' AND LogMessage NOT LIKE '%TEST%';LogMessage ------------------- Ошибка соединения с БД Запуск основного модуля
Пример 5: Поиск с использованием COLLATE для явного указания чувствительности к регистру.
SELECT * FROM Cities WHERE Name LIKE 'моск%' COLLATE Cyrillic_General_CS_AS;(результат будет пустым, если в таблице есть только запись 'Москва')
Пример 6: Экранирование квадратных скобок в шаблоне.
SELECT 'Текст [важный]' WHERE 'Текст [важный]' LIKE '%[[]важный[]]%';Текст [важный]