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