LIKE: примеры (SQL)

Использование оператора LIKE в MS 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: Поиск адресов электронной почты в текстовом поле.

Пример sql
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: Фильтрация по шаблону с переменной, содержащей подстановочные знаки.

Пример sql
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-ограничении для валидации формата данных.

Пример sql
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 с другими условиями для исключения данных.

Пример sql
SELECT LogMessage FROM AppLog WHERE LogMessage NOT LIKE '%DEBUG%' AND LogMessage NOT LIKE '%TEST%';
LogMessage
-------------------
Ошибка соединения с БД
Запуск основного модуля

Пример 5: Поиск с использованием COLLATE для явного указания чувствительности к регистру.

Пример sql
SELECT * FROM Cities WHERE Name LIKE 'моск%' COLLATE Cyrillic_General_CS_AS;
(результат будет пустым, если в таблице есть только запись 'Москва')

Пример 6: Экранирование квадратных скобок в шаблоне.

Пример sql
SELECT 'Текст [важный]' WHERE 'Текст [важный]' LIKE '%[[]важный[]]%';
Текст [важный]

MS SQL LIKE function comments

En
LIKE Determines whether a specific character string matches a specified pattern