Поделиться через


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за которым следует одно пробел), строка, в которой значение этого столбца (abcabcбез пробела) не возвращается. Однако завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если сравнение в запросе заключается в возврате всех строк со строкой 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;

См. также