Функции поиска в строках
Во всех функциях, поиск регистрозависимый по умолчанию. Существуют варианты функций для регистронезависимого поиска.
position(haystack, needle), locate(haystack, needle)
Поиск подстроки needle
в строке haystack
.
Возвращает позицию (в байтах) найденной подстроки в строке, начиная с 1, или 0, если подстрока не найдена.
Для поиска без учета регистра используйте функци ю positionCaseInsensitive.
Синтаксис
position(haystack, needle[, start_pos])
position(needle IN haystack)
Алиас: locate(haystack, needle[, start_pos])
.
Синтаксис position(needle IN haystack)
обеспечивает совместимость с SQL, функция работает так же, как position(haystack, needle)
.
Аргументы
haystack
— строка, по которой выполняется поиск. Строка.needle
— подстрока, которую необходимо найти. Строка.start_pos
— опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.
Возвращаемые значения
- Начальная позиция в байтах (начиная с 1), если подстрока найдена.
- 0, если подстрока не найдена.
Тип: Integer
.
Примеры
Фраза «Hello, world!» содержит набор байт, представляющий текст в однобайтовой кодировке. Функция возвращает ожидаемый результат:
Запрос:
SELECT position('Hello, world!', '!');
Результат:
┌─position('Hello, world!', '!')─┐
│ 13 │
└────────────────────────────────┘
Аналогичная фраза на русском содержит символы, которые не могут быть представлены в однобайтовой кодировке. Функция возвращает неожиданный результат (используйте функцию positionUTF8 для символов, которые не могут быть представлены одним байтом):
Запрос:
SELECT position('Привет, мир!', '!');
Рез ультат:
┌─position('Привет, мир!', '!')─┐
│ 21 │
└───────────────────────────────┘
Примеры работы функции с синтаксисом POSITION(needle IN haystack)
Запрос:
SELECT 1 = position('абв' IN 'абв');
Результат:
┌─equals(1, position('абв', 'абв'))─┐
│ 1 │
└───────────────────────────────────┘
Запрос:
SELECT 0 = position('абв' IN '');
Результат:
┌─equals(0, position('', 'абв'))─┐
│ 1 │
└────────────────────────────────┘
positionCaseInsensitive
Такая же, как и position, но работает без учета регистра. Возвращает позицию в байтах найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор байт, представляющий текст в однобайтовой кодировке. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух байтов, он будет представлен двумя байтами и так далее.
Синтаксис
positionCaseInsensitive(haystack, needle[, start_pos])
Аргументы
haystack
— строка, по которой выполняется поиск. Строка.needle
— подстрока, которую необходимо найти. Строка.start_pos
— опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.
Возвращаемые значения
- Начальная позиция в байтах (начиная с 1), если подстрока найдена.
- 0, если подстрока не найдена.
Тип: Integer
.
Пример
Запрос:
SELECT positionCaseInsensitive('Hello, world!', 'hello');
Результат:
┌─positionCaseInsensitive('Hello, world!', 'hello')─┐
│ 1 │
└───────────────────────────────────────────────────┘
positionUTF8
Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.
Для поиска без учета регистра используйте функцию positionCaseInsensitiveUTF8.
Синтаксис
positionUTF8(haystack, needle[, start_pos])
Аргументы
haystack
— строка, по которой выполняется поиск. Строка.needle
— подстрока, которую необходимо найти. Строка.start_pos
— опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.
Возвращаемые значения
- Начальная позиция в кодовых точках Unicode (начиная с 1), если подстрока найдена.
- 0, если подстрока не найдена.
Тип: Integer
.
Примеры
Фраза «Привет, мир!» содержит набор символов, каждый из которых можно представить с помощью одной кодовой точки. Функция возв ращает ожидаемый результат:
Запрос:
SELECT positionUTF8('Привет, мир!', '!');
Результат:
┌─positionUTF8('Привет, мир!', '!')─┐
│ 12 │
└───────────────────────────────────┘
Фраза «Salut, étudiante!» содержит символ é
, который может быть представлен одной кодовой точкой (U+00E9
) или двумя (U+0065U+0301
). Поэтому функция positionUTF8()
может вернуть неожиданный результат:
Запрос для символа é
, который представлен одной кодовой точкой U+00E9
:
SELECT positionUTF8('Salut, étudiante!', '!');
Result:
┌─positionUTF8('Salut, étudiante!', '!')─┐
│ 17 │
└────────────────────────────────────────┘
Запрос для символа é
, который представлен двумя кодовыми точками U+0065U+0301
:
SELECT positionUTF8('Salut, étudiante!', '!');
Результат:
┌─positionUTF8('Salut, étudiante!', '!')─┐
│ 18 │
└────────────────────────────────────────┘
positionCaseInsensitiveUTF8
Такая же, как и positionUTF8, но работает без учета регистра. Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.
Синтаксис
positionCaseInsensitiveUTF8(haystack, needle[, start_pos])
Аргументы
haystack
— строка, по которой выполняется поиск. Строка.needle
— подстрока, которую необходимо найти. Строка.start_pos
— опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.
Возвращаемые значения
- Начальная позиция в байтах (начиная с 1), если подстрока найдена.
- 0, если подстрока не найдена.
Тип: Integer
.
Пример
Запрос:
SELECT positionCaseInsensitiveUTF8('Привет, мир!', 'Мир');
Результат:
┌─positionCaseInsensitiveUTF8('Привет, мир!', 'Мир')─┐
│ 9 │
└────────────────────────────────────────────────────┘
multiSearchAllPositions
The same as position but returns Array
of positions (in bytes) of the found corresponding substrings in the string. Positions are indexed starting from 1.
The search is performed on sequences of bytes without respect to string encoding and collation.
- For case-insensitive ASCII search, use the function
multiSearchAllPositionsCaseInsensitive
. - For search in UTF-8, use the function multiSearchAllPositionsUTF8.
- For case-insensitive UTF-8 search, use the function multiSearchAllPositionsCaseInsensitiveUTF8.
Syntax
multiSearchAllPositions(haystack, [needle1, needle2, ..., needlen])
Parameters
haystack
— string, in which substring will to be searched. String.needle
— substring to be searched. String.
Returned values
- Array of starting positions in bytes (counting from 1), if the corresponding substring was found and 0 if not found.
Example
Query:
SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world']);
Result:
┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐