LIKE (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric
Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование подстановочных знаков делает LIKE
оператор более гибким, чем с помощью =
операторов сравнения строк.!=
Если один из аргументов не является типом данных строки символов, SQL Server ядро СУБД преобразует его в тип данных строки символов, если это возможно.
Соглашения о синтаксисе 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).
Аргументы
match_expression
Любое допустимое выражение типа данных символов.
pattern
Определенная строка символов для поиска в match_expression и может содержать допустимые подстановочные знаки в следующей таблице. Длина значения pattern не может превышать 8000 байт.
Если match_expression является более высоким приоритетом типа данных, чем шаблон, и длина шаблона больше match_expression, при неявном преобразовании значения шаблона в тип match_expression будет возникать ошибка усечения.
Символ-шаблон | Description | Пример |
---|---|---|
% |
Любая строка, содержащая ноль или более символов. | 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%'
Если задан символ, ядро СУБД ищет число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-символ не указаны, ядро СУБД возвращает строки со строкой30!
.
Если в шаблоне LIKE после escape-символа нет никакого символа, то шаблон является недопустимым и оператор LIKE возвращает значение FALSE. Если символ после escape-символа не является символом-шаблоном, то escape-символ игнорируется, а следующий символ рассматривается как обычный символ в шаблоне. К этим символам-шаблонам относятся: подчеркивание (_), процент (%) и левая квадратная скобка ([), в том случае, если они заключены в квадратные скобки. Escape-символы могут использоваться в квадратных скобках ([ ]), включая: знак вставки (^), дефис (-) и правую квадратную скобку (]).
0x0000
(char(0)) является неопределенным символом в параметрах сортировки Windows и не может быть включен в LIKE.
Примеры
А. Использование 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)
B. Использование 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)
C. Использование предложения 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
D. [ ]
Использование подстановочных знаков
В следующем примере выполняется поиск в таблице 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;
F. Использование NOT LIKE с подстановочным символом %
В следующем примере в таблице DimEmployee
выполняется поиск всех телефонных номеров, которые не начинаются с 612
.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone NOT LIKE '612%'
ORDER BY LastName;
G. Использование LIKE с подстановочным символом _
В следующем примере в таблице DimEmployee
выполняется поиск всех телефонных номеров, начинающихся с 2
и заканчивающихся на 6
. Подстановочный знак "%" добавлен в конце шаблона поиска, что соответствует любым следующим символам в значениях столбца с телефонными номерами.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
Phone
FROM DimEmployee
WHERE phone LIKE '6_2%'
ORDER BY LastName;