MySQL / 4. Работа со строками

Поиск по образцу с помощью шаблонов SQL

Задача
Вы хотите выполнить поиск по образцу, а не буквальное сравнение.

Решение
Используйте оператор LIKE и шаблон SQL, описанный в данном разделе. Или
воспользуйтесь регулярными выражениями, описанными в рецепте 4.7.

Обсуждение
Шаблоны – это строки, содержащие специальные символы. Специальные символы также называют метасимволами, так как они означают нечто отличное от самих себя. MySQL поддерживает два вида поиска по образцу.
В одном из них используются шаблоны SQL, а в другом – регулярные выражения. Шаблоны SQL универсальнее при переходе от одной СУБД к другой, но регулярные выражения являются более мощным средством. Эти два вида поиска по образцу используют различные операторы и различные наборы метасимволов. В данном разделе мы поговорим о шаблонах SQL.
При поиске по шаблону SQL для сравнения строк с образцом используются операторы LIKE и NOT LIKE вместо = и !=. Шаблон может содержать два специальных метасимвола:

  _ (подчеркивание) соответствует любому отдельному символу, а % (знак процента) – любой последовательности символов, включая пустую строку. Вы можете использовать эти символы для создания разнообразных шаблонов:

• Строки, начинающиеся с определенной подстроки:

mysql> SELECT name FROM metal WHERE name LIKE 'co%';

+-------- +
| name   |
+ --------+
| copper |
+ --------+

• Строки, заканчивающиеся определенной подстрокой: mysql> SELECT name FROM metal WHERE name LIKE '%er';

+--------- +
| name    |
+--------- +
| copper  |
| silver    |
+--------- +

• Строки, содержащие (в любом месте) определенную подстроку:

mysql> SELECT name FROM metal WHERE name LIKE '%er%';

+---------- +
| name      |
+ ----------+
| copper   |
| mercury |
| silver     |
+ ---------+

• Строки, содержащие определенную подстроку, которая начинается с указанной позиции (с шаблоном совпадут только те строки, в которых  pp присутствует и начинается с третьей позиции столбца name):

mysql> SELECT name FROM metal WHERE name LIKE '__pp%';
+ -------- +
| name   |
+ --------+
| copper |
+-------- +

Совпадение с шаблоном SQL достигается, только если ему соответствует все сравниваемое значение целиком. То есть из двух приведенных ниже сравнений успешно выполнится только второе:

'abc' LIKE 'b'
'abc' LIKE '%b%'

Чтобы изменить условие поиска на обратное, используйте оператор NOT LIKE.
Следующий запрос находит строки, которые не содержат символов i:

mysql> SELECT name FROM metal WHERE name NOT LIKE '%i%';

+---------- +
| name      |
+ ----------+
| copper   |
| gold       |
| lead       |
| mercury |
+ ----------+

Шаблоны SQL не соответствуют значениям  NULL (это относится и к  LIKE, и к NOT LIKE):

mysql> SELECT NULL LIKE '%', NULL NOT LIKE '%';

+----------------- +----------------------- +
| NULL LIKE '%'  | NULL NOT LIKE '%' |
+----------------- + -----------------------+
|          NULL       |              NULL          |
+ -----------------+----------------------- +

В некоторых случаях поиск по образцу эквивалентен поиску подстроки. На пример, использование шаблонов для поиска строк, находящихся с одного или другого конца строки (табл. 4.2), подобно использованию  LEFT() или RIGHT():

Таблица 4.2. Аналогичные операции
+------------------------+-------------------------+
| Поиск по образцу   | Поиск подстроки     |
+------------------------+-------------------------+
| str LIKE 'abc%'         | LEFT(str,3) = 'abc'    |
| str LIKE '%abc'         | RIGHT(str,3) = 'abc'  |
+------------------------+--------------------------+

Статьи по MySQL на эту тему:

FULLTEXT поиск и короткие слова
Буквальная интерпретация метасимволов в шаблонах
Включение и исключение слов из FULLTEXT - поиска
Поиск по образцу с помощью регулярных выражений
Поиск с помощью индекса FULLTEXT

Вернуться в раздел: MySQL / 4. Работа со строками