Перейти к содержимому
Последнее обновление

LOCATE

Описание​

Функция LOCATE возвращает позицию первого вхождения подстроки substr в строке str (отсчёт начинается с 1). Если указан необязательный третий параметр pos, поиск начинается с указанной позиции в строке str. Эта функция совместима с MySQL и часто используется для поиска совпадений в строках и определения их позиций.

Синтаксис​

LOCATE(<substr>, <str> [, <pos>])

Параметры​

ПараметрОписание
<substr>Искомая подстрока. Тип: VARCHAR
<str>Исходная строка, в которой выполняется поиск. Тип: VARCHAR
<pos>Необязательный параметр, задающий начальную позицию поиска (отсчёт с 1). Тип: INT

Возвращаемое значение​

Возвращает значение типа INT, представляющее позицию первого вхождения substr в str (отсчёт с 1).

Правила поиска:

  • Отсчёт позиций начинается с 1 (а не с 0)
  • Возвращается позиция первого совпадения
  • Если указан pos, поиск начинается с этой позиции, но возвращаемая позиция по-прежнему отсчитывается от начала строки
  • Поиск выполняется с учётом регистра

Особые случаи:

  • Если совпадение не найдено, возвращается 0
  • Если любой из параметров равен NULL, возвращается NULL
  • Если substr является пустой строкой, возвращается 1 (или значение pos, если pos указан и pos > 1)
  • Если str является пустой строкой, а substr нет, возвращается 0
  • Если pos меньше 1, возвращается 0
  • Если pos больше длины str, возвращается 0

Примеры​

  1. Базовый поиск
SELECT LOCATE('bar', 'foobarbar'), LOCATE('xbar', 'foobar'), LOCATE('bar', 'foobarbar', 5);
+----------------------------+--------------------------+-------------------------------+
| LOCATE('bar', 'foobarbar') | LOCATE('xbar', 'foobar') | LOCATE('bar', 'foobarbar', 5) |
+----------------------------+--------------------------+-------------------------------+
| 4 | 0 | 7 |
+----------------------------+--------------------------+-------------------------------+
  1. Поиск первого символа
SELECT LOCATE('f', 'foobar'), LOCATE('r', 'foobar');
+-----------------------+-----------------------+
| LOCATE('f', 'foobar') | LOCATE('r', 'foobar') |
+-----------------------+-----------------------+
| 1 | 6 |
+-----------------------+-----------------------+
  1. Совпадение не найдено
SELECT LOCATE('xyz', 'foobar'), LOCATE('FOO', 'foobar');
+-------------------------+-------------------------+
| LOCATE('xyz', 'foobar') | LOCATE('FOO', 'foobar') |
+-------------------------+-------------------------+
| 0 | 0 |
+-------------------------+-------------------------+
  1. Обработка NULL
SELECT LOCATE(NULL, 'foobar'), LOCATE('foo', NULL), LOCATE(NULL, NULL);
+------------------------+---------------------+--------------------+
| LOCATE(NULL, 'foobar') | LOCATE('foo', NULL) | LOCATE(NULL, NULL) |
+------------------------+---------------------+--------------------+
| NULL | NULL | NULL |
+------------------------+---------------------+--------------------+
  1. Обработка пустых строк
SELECT LOCATE('', 'foobar'), LOCATE('foo', ''), LOCATE('', '');
+----------------------+-------------------+----------------+
| LOCATE('', 'foobar') | LOCATE('foo', '') | LOCATE('', '') |
+----------------------+-------------------+----------------+
| 1 | 0 | 1 |
+----------------------+-------------------+----------------+
  1. Указание начальной позиции
SELECT LOCATE('o', 'foobar', 1), LOCATE('o', 'foobar', 2), LOCATE('o', 'foobar', 4);
+--------------------------+--------------------------+--------------------------+
| LOCATE('o', 'foobar', 1) | LOCATE('o', 'foobar', 2) | LOCATE('o', 'foobar', 4) |
+--------------------------+--------------------------+--------------------------+
| 2 | 2 | 0 |
+--------------------------+--------------------------+--------------------------+
  1. Граничные значения аргумента позиции
SELECT LOCATE('foo', 'foobar', 0), LOCATE('foo', 'foobar', -1), LOCATE('foo', 'foobar', 10);
+----------------------------+-----------------------------+-----------------------------+
| LOCATE('foo', 'foobar', 0) | LOCATE('foo', 'foobar', -1) | LOCATE('foo', 'foobar', 10) |
+----------------------------+-----------------------------+-----------------------------+
| 0 | 0 | 0 |
+----------------------------+-----------------------------+-----------------------------+
  1. Поиск подстроки в UTF-8
SELECT LOCATE('ṛì', 'ṭṛì ḍḍumai'), LOCATE('ḍḍu', 'ṭṛì ḍḍumai');
+----------------------------------------+------------------------------------------+
| LOCATE('ṛì', 'ṭṛì ḍḍumai') | LOCATE('ḍḍu', 'ṭṛì ḍḍumai') |
+----------------------------------------+------------------------------------------+
| 2 | 5 |
+----------------------------------------+------------------------------------------+
  1. Учёт регистра
SELECT LOCATE('BAR', 'foobar'), LOCATE('Bar', 'foobar'), LOCATE('bar', 'fooBAR');
+-------------------------+-------------------------+-------------------------+
| LOCATE('BAR', 'foobar') | LOCATE('Bar', 'foobar') | LOCATE('bar', 'fooBAR') |
+-------------------------+-------------------------+-------------------------+
| 0 | 0 | 0 |
+-------------------------+-------------------------+-------------------------+
  1. Пустая подстрока с аргументом позиции
SELECT LOCATE('', 'foobar', 3), LOCATE('', 'foobar', 7), LOCATE('', '', 1);
+-------------------------+-------------------------+-------------------+
| LOCATE('', 'foobar', 3) | LOCATE('', 'foobar', 7) | LOCATE('', '', 1) |
+-------------------------+-------------------------+-------------------+
| 3 | 0 | 1 |
+-------------------------+-------------------------+-------------------+