Совпадение по шаблону в условиях поиска
Ключевое слово LIKE осуществляет поиск соответствия для символьной строки, а также значений даты или времени по заданному шаблону. Дополнительные сведения см. в разделе Типы данных (Transact-SQL). Для ключевого слова LIKE указывается регулярное выражение, содержащее шаблон, на соответствие которому проверяются значения. Шаблон представляет собой символьную строку — объект поиска, — которая может включать в себя любые комбинации из четырех символов-шаблонов.
Символ-шаблон |
Значение |
---|---|
% |
Любая строка из нуля или более символов. |
_ |
Любой единичный символ. |
[ ] |
Любой символ из указанного диапазона (например [a-f]) или набора символов (например [abcdef]). |
[^] |
Любой символ, не входящий в заданный диапазон (например [^a-f]) или набор символов (например [^abcdef]). |
Символы-шаблоны и символьная строка заключаются в одинарные кавычки, как показано в следующих примерах.
LIKE 'Mc%' осуществляет поиск всех строк, начинающихся с букв «Mc» (например «McBadden»).
LIKE '%inger' осуществляет поиск всех строк, заканчивающихся буквами «inger» (например «Ringer», «Stringer»).
LIKE '%en%' осуществляет поиск всех строк, которые содержат сочетание «en» в любом месте строки (например «Bennet», «Green», «McBadden»).
LIKE '_heryl' осуществляет поиск всех имен, состоящих из шести букв и заканчивающихся на «heryl» (например «Cheryl», «Sheryl»).
LIKE '[CK]ars[eo]n' осуществляет поиск вхождений «Carsen», «Karsen», «Carson» и «Karson» (например «Carson»).
LIKE '[M-Z]inger' осуществляет поиск всех имен, заканчивающихся на «inger» и начинающихся на любую букву из диапазона от M до Z (например «Ringer»).
LIKE 'M[^c]%' осуществляет поиск всех имен, которые начинаются на букву «М» и не содержат во второй позиции символа «с» (например «MacFeather»).
Следующий запрос найдет в таблице Person все телефонные номера с кодом города 415:
SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone LIKE '415%';
Предложение NOT LIKE может использоваться с теми же символами-шаблонами. Чтобы найти в таблице Person все телефонные номера с кодом города, отличным от 415, можно выполнить один из следующих запросов:
SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone NOT LIKE '415%';
-- Or
SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE NOT Phone LIKE '415%';
Предложение IS NOT NULL можно использовать с шаблонами и предложением LIKE. Например, следующий запрос получает из таблицы Person телефонные номера, которые начинаются на 415 и IS NOT NULL:
USE AdventureWorks2008R2;
GO
SELECT Phone
FROM Person.Person
WHERE Phone LIKE '415%' and Phone IS NOT NULL;
Важно! |
---|
Результат, возвращаемый инструкциями, включающими ключевое слово LIKE, зависит от порядка сортировки, выбранного во время установки. Дополнительные сведения о том, как влияют на результат различные порядки сортировки, см. в разделе Работа с параметрами сортировки. |
Единственными условиями WHERE, которые можно использовать для столбцов типа text, являются LIKE, IS NULL или PATINDEX.
Символы-шаблоны, указанные без ключевого слова LIKE, рассматриваются как константы, а не шаблоны, и представляют только свое собственное значение. В следующем примере производится поиск только тех телефонных номеров, которые состоят из четырех символов 415%. Номера, начинающиеся с 415, найдены не будут. Дополнительные сведения о константах см. в разделе Константы (компонент Database Engine).
SELECT Phone
FROM AdventureWorks2008R2.Person.Person
WHERE Phone = '415%';
Другим важным аспектом использования символов-шаблонов является их влияние на производительность. Если символ-шаблон находится в начале выражения, становится невозможным использование индекса (вы бы тоже не знали, с какой страницы начать поиск в телефонной книге по фамилии «%mith», а не «Smith»). Если символ-шаблон находится в середине или конце выражения, это не влияет на использование индекса (то есть известно, с чего начать поиск в телефонной книге по фамилии «Samuel%», даже если в ней также присутствуют «Samuels» и «Samuelson»).
Поиск символов-шаблонов
Поиск может производиться и для символов-шаблонов. Существуют два следующих способа указать символ, который обычно используется в качестве шаблона.
Использовать ключевое слово ESCAPE для задания экранирующего символа. Если экранирующий символ находится перед символом-шаблоном, последний знак рассматривается как обычный символ. Например, чтобы найти где-либо в строке вхождение 5%, воспользуйтесь следующим предложением:
WHERE ColumnA LIKE '%5/%%' ESCAPE '/'
В этом предложении LIKE начальный и конечный символы процента (%) интерпретируются как символы-шаблоны, а символ процента, перед которым указана косая черта (/), интерпретируется как обычный символ «%».
Заключить символ-шаблон в квадратные скобки ([ ]). Чтобы найти дефис (-), не используя его для задания диапазона, укажите его первым символом внутри квадратных скобок:
WHERE ColumnA LIKE '9[-]5'
В следующей таблице показано использование квадратных скобок с символами-шаблонами.
Символ
Значение
LIKE '5[%]'
5%
LIKE '5%'
Цифра «5», за которой следует строка из нуля или более символов
LIKE '[_]n'
_n
LIKE '_n'
Слова «an», «in», «on» (и так далее)
LIKE '[a-cdf]'
a, b, c, d или f
LIKE '[-acdf]'
-, a, b, c, d или f
LIKE '[ [ ]'
[
LIKE ']'
]
При сравнении строк оператором LIKE учитываются все символы строки-шаблона, в том числе все начальные и завершающие пробелы. Если запрос производит поиск строк с ключевым словом LIKE 'abc ' (содержащих символы «abc», за которыми следует один пробел), то строка, в которой столбец содержит символы «abc» (без пробела), возвращен не будет. Но не наоборот: завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если запрос должен вернуть строки LIKE 'abc' (содержащие символы «abc» без пробела), то будут возвращены все строки, значения в которых начинаются с букв «abc», за которыми могут следовать один, ни одного или несколько пробелов.
См. также