Оператор Like
Сравнивает строковое выражение с шаблоном в выражении SQL.
Синтаксис
выражение Like «шаблон«
Синтаксис оператора Like включает в себя следующие компоненты:
Выражение SQL, используемое в предложении WHERE.
Строка или строковый литерал, с которыми сравнивается выражение.
Замечания
Оператор Like можно использовать для поиска значений полей, соответствующих указанному шаблону. В качестве шаблона можно задать полное значение (например, Like “Smith” ) или использовать подстановочные знаки, чтобы получить диапазон значений (например, Like “Sm*”) ).
Оператор Like можно использовать в выражении для сравнения значений полей с строками. Например, если ввести Like “C*” запросе SQL, запрос возвратит все значения полей, начиная с буквы C. В запрос с параметрами запрос на поиск шаблона.
Следующий пример возвращает данные, которые начинаются с буквы P, за которой идут любая буква от A до F и три цифры:
В следующей таблице показано, как использовать оператор Like для проверки на соответствие различным шаблонам:
Тип совпадения
Соответствие
(возвращает значение «Истина»)
Нет соответствия
(возвращает значение «Истина»)
Предикат LIKE стр. 1
Предикат LIKE сравнивает строку, указанную в первом выражении, для вычисления значения строки, называемого проверяемым значением, с образцом, который определен во втором выражении для вычисления значения строки. В образце разрешается использовать два трафаретных символа:
- символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении;
- символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.
Если проверяемое значение соответствует образцу с учетом трафаретных символов, то значение предиката равно TRUE . Ниже приводится несколько примеров написания образцов.
Найти все корабли, имена классов которых заканчиваются на букву ‘о’
Консоль
Выполнить
Результатом выполнения запроса будет следующая таблица:
Найти все корабли, имена классов которых заканчиваются на букву ‘о’, но не на ‘go’
Консоль
Выполнить
Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE . Этот управляющий символ должен использоваться в образце перед трафаретным символом, сообщая о том, что последний следует трактовать как обычный символ. Например, если в некотором поле следует отыскать все значения, содержащие символ «_», то шаблон ‘%_%’ приведет к тому, что будут возвращены все записи из таблицы. В данном случае шаблон следует записать следующим образом:
Для проверки значения на соответствие строке «25%» можно воспользоваться таким предикатом:
Следует заметить, что MySQL и PostgreSQL допускают помимо ESCAPE-символа экранирование трафаретных символов с помощью обратного слеша (\) в стиле некоторых языков программирования общего назначения. Для этих СУБД последние два шаблона можно записать так:
Несмотря на краткость такой записи, она несет в собе потенциальную проблему при переходе на другую платформу.
Истинностное значение предиката LIKE присваивается в соответствии со следующими правилами:
- если либо проверяемое значение, либо образец, либо управляющий символ есть NULL , истинностное значение равно UNKNOWN ;
- в противном случае, если проверяемое значение и образец имеют нулевую длину, истинностное значение равно TRUE ;
- в противном случае, если проверяемое значение соответствует шаблону, то предикат LIKE равен TRUE ;
- если не соблюдается ни одно из перечисленных выше условий, предикат LIKE равен FALSE .
Страницы: | 1 | 2 |
Оператор LIKE SQL: примеры и синтаксис
LIKE в SQL выполняет функцию оператора, который помогает фильтровать результаты. Показываем, как правильно использовать оператор LIKE.
LIKE SQL — это оператор, который используется для поиска строк, содержащих определённый шаблон символов. Подробнее о нём читайте в нашей статье.
- Синтаксис LIKE SQL
- Примеры использования LIKE SQL
Синтаксис LIKE SQL
Использовать оператор LIKE в SQL очень просто: достаточно прописать стандартную команду выбора SELECT * FROM и задать условие через WHERE, где и будет использован оператор LIKE.
Шаблон LIKE SQL:
SELECT column1, column2, . FROM table_nameWHERE columnN LIKE pattern;
Существует два подстановочных знака, которые используются в сочетании с оператором LIKE SQL:
- % — знак процента представляет собой ноль, один или несколько символов;
- _ — подчёркивание представляет собой один символ.
Примеры использования LIKE SQL
Рассмотрим SQL LIKE примеры. Представим, что вы хотите найти все имена, начинающиеся с буквы J. Для этого достаточно использовать следующий запрос:
SELECT * FROM table_name WHERE name LIKE 'J%';
В данном случае символ % используется для указания любого количества символов после J. Таким образом, запрос найдёт все имена, которые начинаются с буквы J, независимо от того, какие символы следуют за ней.
Ещё один пример — поиск всех адресов электронной почты, содержащих слово gmail. Для этого можно использовать следующий запрос:
SELECT * FROM table_name WHERE email LIKE '%gmail%';
Здесь символы % используются для указания, что слово gmail может быть в любом месте в адресе электронной почты.
Также можно использовать символ _ для указания одного символа. Например, запрос ниже найдет все имена, состоящие из шести символов. Эти имена должны начинаться с буквы J и заканчиваться буквой n:
SELECT * FROM table_name WHERE name LIKE 'J____n';
Здесь каждый символ _ указывает на любой один символ.
Иногда символы % и _ сами могут быть частью искомой строки. В таких случаях их нужно экранировать. Например, запрос ниже найдет все имена, содержащие символ %:
SELECT * FROM table_name WHERE name LIKE '%\%%';
Это было короткое руководство по работе с SQL LIKE. Также вы можете почитать о других основных командах SQL.
LIKE (Transact-SQL)
Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование wild карта символов делает LIKE оператор более гибким, чем с помощью = операторов сравнения строк и != строк. Если один из аргументов не является типом данных строки символов, SQL Server ядро СУБД преобразует его в тип данных строки символов, если это возможно.
Синтаксис
Синтаксис для 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 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
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;
См. также
- PATINDEX (Transact-SQL)
- Выражения (Transact-SQL)
- Что такое функции базы данных SQL?
- SELECT (Transact-SQL)
- SELECT (Transact-SQL)
- WHERE (Transact-SQL)