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


LIKE (Transact-SQL)

Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование символов-шаблонов с оператором LIKE предоставляет больше возможностей, чем использование операторов сравнения строк = и !=. Если тип данных одного из аргументов не является символьной строкой, компонент SQL Server Database Engine, если это возможно, преобразует его в тип данных символьной строки.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Аргументы

  • match_expression
    Любое допустимое выражение символьного типа данных.

  • pattern
    Заданная символьная строка для поиска в строке match_expression, которая может включать следующие допустимые символы-шаблоны. Аргумент pattern может иметь размер до 8000 байт.

    Символ-шаблон

    Описание

    Пример

    %

    Любая строка длиной от нуля и более символов.

    Инструкция WHERE Название LIKE '%компьютер%' выполняет поиск и выдает все названия книг, содержащие слово «компьютер».

    _ (подчеркивание)

    Любой одиночный символ.

    Инструкция WHERE фамилия_автора LIKE '_етров' выполняет поиск и выдает все имена, состоящие из шести букв и заканчивающиеся сочетанием «етров» (Петров, Ветров и т.п.).

    [ ]

    Любой одиночный символ, содержащийся в диапазоне ([a-f]) или наборе ([abcdef]).

    Инструкция WHERE Фамилия_автора LIKE '[Л-С]омов' выполняет поиск и выдает все фамилии авторов, заканчивающиеся на «омов» и начинающиеся на любую букву в промежутке от «Л» до «С», например Ломов, Ромов, Сомов и т.п. При выполнении операции поиска в диапазоне символы, включенные в диапазон, могут изменяться в зависимости от правил сортировки параметров сортировки.

    [^]

    Любой символ, содержащийся в диапазоне ([^a-f]) или наборе ([^abcdef]).

    Инструкция WHERE Фамилия_автора LIKE 'ив[^а]%' выполняет поиск и выдает все фамилии, начинающиеся на «ив», в которых третья буква отличается от «а».

  • escape_character
    Символ, помещаемый перед символом-шаблоном, чтобы символ-шаблон рассматривался как обычный символ, а не как шаблон. Аргумент escape_character является символьным выражением, не имеющим значения по умолчанию и возвращающим результат в виде одного символа.

Типы результата

Boolean

Значение результата

Оператор LIKE возвращает значение TRUE, если аргумент match_expression совпадает с указанным аргументом pattern.

Замечания

При использовании оператора LIKE для сравнения строк во внимание принимаются все символы строки-шаблона. Это касается начальных и конечных пробелов (« »). Если операция сравнения в запросе должна вернуть все строки, содержащие строки LIKE 'абв ' (с символом пробела на конце), то строка, содержащая «абв» (без пробела), не будет возвращена. Однако завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если операция сравнения в запросе должна вернуть все строки, содержащие строки LIKE 'абв' (без знака пробела на конце), то будут возвращены все строки, содержащие «абв», как с завершающими пробелами, так и без них.

При использовании шаблона, содержащего тип данных char или varchar для сравнения строк с помощью оператора LIKE, могут возникнуть проблемы, связанные с методом хранения данных. Необходимо знать методы хранения каждого типа данных, чтобы избежать некорректного использования оператора LIKE. В ходе выполнения следующего примера переменная char передается хранимой процедуре, а затем с помощью сравнения с шаблоном выполняется поиск всех сотрудников, чьи фамилии начинаются с указанной последовательности букв.

USE AdventureWorks2008R2;
GO
CREATE PROCEDURE FindEmployee @EmpLName char(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p 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 не добавляются.

USE AdventureWorks2008R2;
GO
CREATE PROCEDURE FindEmployee @EmpLName varchar(20)
AS
SELECT @EmpLName = RTRIM(@EmpLName) + '%';
SELECT p.FirstName, p.LastName, a.City
FROM Person.Person p JOIN Person.Address a ON p.BusinessEntityID = a.AddressID
WHERE p.LastName LIKE @EmpLName;
GO
EXEC FindEmployee @EmpLName = 'Barb';

Ниже приводится результирующий набор.

FirstName LastName City

---------- ----------------------------------------

Angela Barbariol Snohomish

David Barber Snohomish

(2 row(s) affected)

Совпадение с шаблоном с использованием оператора LIKE

Оператор LIKE поддерживает шаблоны в ASCII и Юникоде. Если все аргументы (match_expression, pattern и escape_character, если он указан) имеют символьный тип ASCII, то применяется шаблон ASCII. В случае, когда какой-либо из аргументов имеет тип данных Юникод, выполняется преобразование всех аргументов в Юникод и применяется шаблон Юникод. При работе оператора LIKE с данными в Юникоде (типы данных nchar и nvarchar) учитываются завершающие пробелы; однако для других типов данных завершающие пробелы не учитываются. Работа оператора LIKE с данными в Юникоде совместима со стандартом ISO. Принцип работы оператора LIKE с данными ASCII совместим с более ранними версиями SQL Server.

Приведенные ниже примеры поясняют различия между результатами сравнения данных с шаблонами оператора LIKE, представленными в Юникоде и ASCII.

-- 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», за которым следует любая строка с числом символов от нуля и больше.

Например, при выполнении следующего примера отображаются все динамические административные представления базы данных База данных AdventureWorks2008R2, так как все они начинаются символами dm.

USE AdventureWorks2008R2;
GO
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, b, c, d или f

LIKE '[ [ ]'

[

LIKE ']'

]

LIKE 'abc[_]d%'

abc_d и abc_de

LIKE 'abc[def]'

abcd, abce и abcf

Совпадение с шаблоном с помощью предложения ESCAPE

Можно искать символьные строки, в состав которых входит один или более специальных символов-шаблонов. Например, таблица discounts базы данных customers может содержать значения скидок, включающих знак процента (%). Чтобы выполнить поиск знака процента в качестве обычного символа, необходимо ввести ключевое слово ESCAPE и экранирующий символ. Например, образец базы данных содержит столбец с именем comment, в котором хранится значение «30 %». Чтобы найти строки, содержащие последовательность символов «30 %» в столбце comment, необходимо указать предложение WHERE, например WHERE comment LIKE '%30!%%' ESCAPE '!'. Если предложение ESCAPE и escape-символ не указаны, компонент Database Engine вернет все строки, содержащие последовательность символов «30».

Если в шаблоне LIKE после экранирующего символа нет никакого символа, то шаблон является недопустимым и оператор LIKE возвращает значение FALSE. Если символ после экранирующего символа не является символом-шаблоном, то экранирующий символ игнорируется, а этот символ рассматривается как обычный символ в шаблоне. Это относится к таким символам-шаблонам, как подчеркивание (_), процент (%) и левая квадратная скобка ([), в том случае, если они заключены в квадратные скобки. Также в квадратных скобках ([ ]) и при использовании экранирующих символов можно использовать такие символы, как знак вставки (^), дефис (-) и правая квадратная скобка (]).

0x0000 (char(0)) является неопределенным символом в параметрах сортировки Windows и не может быть включен в предложение LIKE.

Примеры

A. Применение оператора LIKE с символом-шаблоном %

В следующем примере в таблице PersonPhone выполняется поиск всех телефонных номеров с региональным кодом 415.

USE AdventureWorks2008R2;
GO
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-0124

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.

USE AdventureWorks2008R2;
GO
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 и экранирующий символ используются для поиска символьной строки 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');
INSERT mytbl2 VALUES ('Discount is .10-.15 off');
GO
SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
GO

Г. Применение символов-шаблонов [ ]

В следующем примере выполняется поиск в таблице Person сотрудников с именем Cheryl или Sheryl.

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID, FirstName, LastName 
FROM Person.Person 
WHERE FirstName LIKE '[CS]heryl';
GO

В следующем примере выполняется поиск строк в таблице Person для сотрудников с фамилией Zheng или Zhang.

USE AdventureWorks2008R2;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'Zh[ae]ng'
ORDER BY LastName ASC, FirstName ASC;
GO