LIKE (Transact-SQL)
Применимо к: SQL Server Azure SQL Database
Управляемый экземпляр SQL Azure
Azure Synapse Analytics Analytics
Platform System (PDW)
Конечная точка SQL в Microsoft FabricWarehouse в Microsoft Fabric
Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование подстановочных знаков делает оператор более гибким LIKE
, чем использование =
операторов сравнения строк и !=
. Если тип данных одного из аргументов не является символьной строкой, компонент Компонент SQL Server Database Engine, если это возможно, преобразует его в тип данных символьной строки.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server и Базы данных SQL Azure:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Синтаксис для Azure Synapse Analytics и Parallel Data Warehouse:
match_expression [ NOT ] LIKE pattern
ESCAPE
и STRING_ESCAPE
не поддерживаются в Azure Synapse Analytics или Analytics Platform System (PDW).
Примечание
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
match_expression
Любое допустимое выражение символьного типа данных.
pattern
Конкретная строка символов для поиска в match_expression и может включать допустимые подстановочные знаки в следующей таблице. Длина значения pattern не может превышать 8000 байт.
Если match_expression является типом данных с более высоким приоритетом, чем pattern, а длина шаблона больше match_expression, во время неявного преобразования значения шаблона в match_expression тип вы получите ошибку усечения.
Символ-шаблон | Описание | Пример |
---|---|---|
% |
Любая строка, содержащая ноль или более символов. | WHERE title LIKE '%computer%' находит все названия книг со словом computer в любом месте в названии книги. |
и символ подчеркивания (_ ). |
Любой одиночный символ. | WHERE au_fname LIKE '_ean' находит все имена из четырех букв, заканчивающиеся ean на (Dean , Sean и т. д.). |
[ ] |
Любой отдельный символ в указанном диапазоне [a-f] или задать [abcdef] . |
WHERE au_lname LIKE '[C-P]arsen' находит фамилии автора, arsen заканчивающиеся на и начинающиеся с любого отдельного символа между C и P , например Carsen , Larsen , Karsen и т. д. При выполнении операции поиска в диапазоне символы, включенные в диапазон, могут изменяться в зависимости от правил сортировки параметров сортировки. |
[^] |
Любой отдельный символ, не в пределах заданного диапазона [^a-f] или задается [^abcdef] . |
WHERE au_lname LIKE 'de[^l]%' находит все фамилии авторов, начиная с de и где следующая буква не l является . |
escape_character
Символ, помещаемый перед подстановочным знаком, чтобы указать, что подстановочный знак интерпретируется как обычный, а не как подстановочный знак. Аргумент escape_character является символьным выражением, не имеющим значения по умолчанию и возвращающим результат в виде одного символа.
Тип результата
Boolean
Значение результата
LIKE
возвращает значение TRUE, если match_expression соответствует указанному шаблону.
Комментарии
При сравнении строк с помощью LIKE
все символы в строке шаблона имеют важное значение. К значимым символам также относятся начальные и конечные пробелы. Если при сравнении в запросе возвращаются все строки со строкой LIKE 'abc '
(abc
за которым следует один пробел), строка, в которой значение этого столбца равно abc
(abc
без пробела), не возвращается. Однако завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если сравнение в запросе возвращает все строки со строкой LIKE 'abc'
(abc
без пробела), возвращаются все строки, начинающиеся с abc
и имеющие ноль или более конечных пробелов.
Сравнение строк с использованием шаблона, содержащего данные char и varchar , может не пройти LIKE
сравнение из-за того, как данные хранятся для каждого типа данных. В следующем примере локальная переменная char передается в хранимую процедуру, а затем используется сопоставление шаблонов для поиска всех сотрудников, фамилии которых начинаются с указанного набора символов.
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName CHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
Выполнение процедуры FindEmployee
не дает результатов, так как переменная типа char (@EmpLName
) всегда имеет длину в 20 символов, до которой дополняется завершающими знаками пробела. Переменные, содержащиеся в столбце LastName
, имеют тип varchar. Поэтому завершающие пробелы в них не дописываются. Данная процедура завершается неудачей, так как завершающие пробелы учитываются.
Процедура из следующего примера выполняется успешно, так как завершающие пробелы к переменной типа varchar не добавляются.
-- Uses AdventureWorks
CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName,
p.LastName,
a.City
FROM Person.Person p
INNER JOIN Person.Address a
ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';
GO
Результирующий набор:
FirstName LastName City
---------- -------------------- ---------------
Angela Barbariol Snohomish
David Barber Snohomish
(2 row(s) affected)
Сопоставление шаблонов с помощью LIKE
LIKE
поддерживает сопоставление шаблонов ASCII и сопоставление шаблонов Юникода. Если все аргументы (match_expression, pattern и escape_character, если он указан) имеют символьный тип ASCII, то применяется шаблон ASCII. Если какой-либо из аргументов относится к типу данных Юникода, все аргументы преобразуются в Юникод и выполняется сопоставление шаблонов Юникода. Если вы используете данные Юникода (типы данных nchar или nvarchar ) с LIKE
, конечные пробелы имеют большое значение; однако для данных, отличных от Юникода, конечные пробелы не имеют большого значения. Юникод LIKE
совместим со стандартом ISO. ASCII LIKE
совместим с более ранними версиями SQL Server.
В следующей серии примеров показаны различия в строках, возвращаемых при сопоставлении шаблонов ASCII и Юникода LIKE
.
-- ASCII pattern matching with char column
CREATE TABLE t (col1 CHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- returns 1 row
-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE col1 LIKE '% King'; -- no rows returned
-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 NCHAR(30));
INSERT INTO t
VALUES ('Robert King');
SELECT * FROM t
WHERE RTRIM(col1) LIKE '% King'; -- returns 1 row
Примечание
LIKE
на сравнения влияют параметры сортировки. Дополнительные сведения см. в статье COLLATE (Transact-SQL).
Использование подстановочного %
знака
LIKE '5%'
Если указан символ, компонент Компонент Database Engine выполняет поиск числа5
, за которым следует любая строка из нуля или более символов.
Например, при выполнении следующего примера отображаются все динамические административные представления базы данных AdventureWorks2022
, так как все они начинаются символами dm
.
-- Uses AdventureWorks
SELECT Name
FROM sys.system_views
WHERE Name LIKE 'dm%';
GO
Чтобы отобразить все объекты, не являющиеся динамическими административными представлениями, используется синтаксис NOT LIKE 'dm%'
. Если у вас есть в общей сложности 32 объекта и LIKE
вы обнаружили 13 имен, которые соответствуют шаблону, NOT LIKE
найдешь 19 объектов, которые не соответствуют шаблону LIKE
.
По такому шаблону, как LIKE '[^d][^m]%'
, не всегда будут возвращаться одни и те же имена. Вместо 19 имен можно найти только 14, так как имена, которые начинаются с буквы d
или у которых второй буквой является m
, будут исключены из результата, как и имена динамических административных представлений. Причиной такой реакции на событие является поэтапный поиск отрицательных символов-шаблонов: за один шаг обрабатывается один символ-шаблон. Процесс поиска совпадений прекращается при возникновении сбоя на любой стадии выполнения.
Использование подстановочных знаков в качестве литерала
Символы-шаблоны могут быть использованы в качестве литералов. Чтобы использовать символ-шаблон в качестве литерала, его необходимо заключать в скобки. В следующей таблице приведено несколько примеров использования LIKE
ключевое слово и [ ]
подстановочных знаков.
Символ | Значение |
---|---|
LIKE '5[%]' |
5% |
LIKE '[_]n' |
_n |
LIKE '[a-cdf]' |
a , b , c , d или f |
LIKE '[-acdf]' |
- , a , c , d или f |
LIKE '[ [ ]' |
[ |
LIKE ']' |
] |
LIKE 'abc[_]d%' |
abc_d и abc_de |
LIKE 'abc[def]' |
abcd , abce и abcf . |
Сопоставление шаблона с предложением ESCAPE
Можно искать символьные строки, в состав которых входит один или более специальных символов-шаблонов. Например, таблица discounts базы данных customers может содержать значения скидок, включающих знак процента (%). Чтобы выполнить поиск знака процента в качестве символа-шаблона, необходимо ввести ключевое слово ESCAPE и escape-символ. Например, образец базы данных содержит столбец с именем comment, в котором хранится значение «30%». Чтобы найти строки, содержащие последовательность символов «30%» в столбце comment, необходимо указать предложение WHERE, например WHERE comment LIKE '%30!%%' ESCAPE '!'
. Если ESCAPE и escape-символ не указаны, компонент Database Engine возвращает все строки со строкой 30!
.
Если в шаблоне LIKE после escape-символа нет никакого символа, то шаблон является недопустимым и оператор LIKE возвращает значение FALSE. Если символ после escape-символа не является символом-шаблоном, то escape-символ игнорируется, а следующий символ рассматривается как обычный символ в шаблоне. К этим символам-шаблонам относятся: подчеркивание (_), процент (%) и левая квадратная скобка ([), в том случае, если они заключены в квадратные скобки. Escape-символы могут использоваться в квадратных скобках ([ ]), включая: знак вставки (^), дефис (-) и правую квадратную скобку (]).
0x0000
(char(0)) является неопределенным символом в параметрах сортировки Windows и не может быть включен в LIKE.
Примеры
A. Использование LIKE с подстановочным %
знаком
В следующем примере в таблице 415
выполняется поиск всех телефонных номеров с кодом города PersonPhone
.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber LIKE '415%'
ORDER BY p.LastName;
GO
Результирующий набор:
FirstName LastName Phone
----------------- ------------------- ------------
Ruben Alonso 415-555-124
Shelby Cook 415-555-0121
Karen Hu 415-555-0114
John Long 415-555-0147
David Long 415-555-0123
Gilbert Ma 415-555-0138
Meredith Moreno 415-555-0131
Alexandra Nelson 415-555-0174
Taylor Patterson 415-555-0170
Gabrielle Russell 415-555-0197
Dalton Simmons 415-555-0115
(11 row(s) affected)
Б. Использование параметра NOT LIKE с подстановочным %
знаком
В следующем примере в таблице PersonPhone
выполняется поиск всех телефонных номеров с региональным кодом, отличным от 415
.
-- Uses AdventureWorks
SELECT p.FirstName,
p.LastName,
ph.PhoneNumber
FROM Person.PersonPhone AS ph
INNER JOIN Person.Person AS p
ON ph.BusinessEntityID = p.BusinessEntityID
WHERE ph.PhoneNumber NOT LIKE '415%'
AND p.FirstName = 'Gail'
ORDER BY p.LastName;
GO
Результирующий набор:
FirstName LastName Phone
---------------------- -------------------- -------------------
Gail Alexander 1 (11) 500 555-0120
Gail Butler 1 (11) 500 555-0191
Gail Erickson 834-555-0132
Gail Erickson 849-555-0139
Gail Griffin 450-555-0171
Gail Moore 155-555-0169
Gail Russell 334-555-0170
Gail Westover 305-555-0100
(8 row(s) affected)
В. Использование предложения ESCAPE
В следующем примере предложение ESCAPE
и escape-символ используются для поиска символьной строки 10-15%
в столбце c1
таблицы mytbl2
.
USE tempdb;
GO
IF EXISTS (
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytbl2'
)
DROP TABLE mytbl2;
GO
USE tempdb;
GO
CREATE TABLE mytbl2 (c1 SYSNAME);
GO
INSERT mytbl2
VALUES ('Discount is 10-15% off'),
('Discount is .10-.15 off');
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO
Г. Использование подстановочных [ ]
знаков
В следующем примере выполняется поиск в таблице Person
сотрудников с именем Cheryl
илиSheryl
.
-- Uses AdventureWorks
SELECT BusinessEntityID,
FirstName,
LastName
FROM Person.Person
WHERE FirstName LIKE '[CS]heryl';
GO
В следующем примере выполняется поиск строк в таблице Person
для сотрудников с фамилией Zheng
или Zhang
.
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC,
FirstName ASC;
GO
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
Д. Использование LIKE с подстановочным %
знаком
В следующем примере в таблице DimEmployee
выполняется поиск всех сотрудников, телефонные номера которых начинаются с 612
.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '612%'
ORDER BY LastName;
Е. Использование параметра NOT LIKE с подстановочным %
знаком
В следующем примере в таблице DimEmployee
выполняется поиск всех телефонных номеров, которые не начинаются с 612
.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
Ж. Использование LIKE с подстановочным _
знаком
В следующем примере в таблице DimEmployee
выполняется поиск всех телефонных номеров, начинающихся с 2
и заканчивающихся на 6
. Подстановочный знак "%" добавлен в конце шаблона поиска, что соответствует любым следующим символам в значениях столбца с телефонными номерами.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;