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


Совпадение по шаблону в условиях поиска

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