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

Функции для поиска в строках

Все функции в этом разделе по умолчанию выполняют поиск с учётом регистра. Поиск без учёта регистра обычно реализуется отдельными вариантами функций.

Примечание

Поиск без учёта регистра следует правилам соответствия строчных и прописных букв английского языка. Например, заглавная буква i в английском языке — это I, тогда как в турецком языке — это İ; результаты для языков, отличных от английского, могут быть неожиданными.

Функции в этом разделе также предполагают, что строка, в которой выполняется поиск (в этом разделе она называется haystack), и искомая строка (называемая в этом разделе needle) представляют собой однобайтовый текст. Если это предположение не выполняется, исключение не выбрасывается, а результаты не определены. Поиск по строкам в кодировке UTF-8 обычно реализуется отдельными вариантами функций. Аналогично, если используется UTF-8-вариант функции, а входные строки не являются текстом в кодировке UTF-8, исключение не выбрасывается, а результаты не определены. Обратите внимание, что автоматическая нормализация Unicode не выполняется; при необходимости вы можете использовать для этого функции normalizeUTF8*().

Общие функции для работы со строками и функции для замены в строках описаны отдельно.

Примечание

Документация ниже сгенерирована из системной таблицы system.functions.

countMatches

Впервые появилась в: v21.1

Возвращает количество совпадений регулярного выражения в строке.

Зависимость поведения от версии

Поведение этой функции зависит от версии ClickHouse:

  • в версиях < v25.6 функция прекращает подсчет при первом пустом совпадении, даже если шаблон принимает пустое совпадение.
  • в версиях >= 25.6 функция продолжает выполнение при возникновении пустого совпадения. Устаревшее поведение можно вернуть, используя настройку count_matches_stop_at_empty_match = true;

Синтаксис

countMatches(haystack, pattern)

Аргументы

  • haystack — Строка, в которой осуществляется поиск. String
  • pattern — Шаблон регулярного выражения. String

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

Возвращает количество найденных вхождений. UInt64

Примеры

Подсчёт последовательностей цифр

SELECT countMatches('hello 123 world 456 test', '[0-9]+')
┌─countMatches('hello 123 world 456 test', '[0-9]+')─┐
│                                                   2 │
└─────────────────────────────────────────────────────┘

countMatchesCaseInsensitive

Добавлена в версии: v21.1

Аналог countMatches, но выполняет сравнение без учета регистра.

Синтаксис

countMatchesCaseInsensitive(haystack, pattern)

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • pattern — шаблон регулярного выражения. const String

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

Возвращает количество найденных совпадений. UInt64

Примеры

Подсчёт без учёта регистра

SELECT countMatchesCaseInsensitive('Hello HELLO world', 'hello')
┌─countMatchesCaseInsensitive('Hello HELLO world', 'hello')─┐
│                                                         2 │
└───────────────────────────────────────────────────────────┘

countSubstrings

Добавлена в версии: v21.1

Возвращает, сколько раз подстрока needle встречается в строке haystack.

Синтаксис

countSubstrings(haystack, needle[, start_pos])

Аргументы

  • haystack — строка, в которой выполняется поиск. String или Enum. - needle — подстрока, которую нужно найти. String. - start_pos — позиция (нумерация с 1) в haystack, с которой начинается поиск. UInt. Необязательный параметр.

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

Количество вхождений. UInt64

Примеры

Пример использования

SELECT countSubstrings('aaaa', 'aa');
┌─countSubstrings('aaaa', 'aa')─┐
│                             2 │
└───────────────────────────────┘

С использованием аргумента start_pos

SELECT countSubstrings('abc___abc', 'abc', 4);
┌─countSubstrings('abc___abc', 'abc', 4)─┐
│                                      1 │
└────────────────────────────────────────┘

countSubstringsCaseInsensitive

Введена в версии v21.1

Аналог countSubstrings, но выполняет подсчёт без учёта регистра.

Синтаксис

countSubstringsCaseInsensitive(haystack, needle[, start_pos])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или Enum
  • needle — Подстрока, которую требуется найти. String
  • start_pos — Необязательный аргумент. Позиция (считая с 1) в haystack, с которой начинается поиск. UInt*

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

Возвращает количество вхождений needle в haystack. UInt64

Примеры

Пример использования

SELECT countSubstringsCaseInsensitive('AAAA', 'aa');
┌─countSubstri⋯AAA', 'aa')─┐
│                        2 │
└──────────────────────────┘

С аргументом start_pos

SELECT countSubstringsCaseInsensitive('abc___ABC___abc', 'abc', 4);
┌─countSubstri⋯, 'abc', 4)─┐
│                        2 │
└──────────────────────────┘

countSubstringsCaseInsensitiveUTF8

Добавлена в: v21.1

Аналог countSubstrings, но выполняет подсчёт без учёта регистра и предполагает, что аргумент haystack является строкой в кодировке UTF-8.

Синтаксис

countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String или Enum
  • needle — подстрока, которую нужно найти. String
  • start_pos — необязательный параметр. Позиция (считая с 1) в haystack, с которой начинается поиск. UInt*

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

Возвращает количество вхождений needle в haystack. UInt64

Примеры

Пример использования

SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА');
┌─countSubstri⋯шка', 'КА')─┐
│                        4 │
└──────────────────────────┘

С аргументом start_pos

SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА', 13);
┌─countSubstri⋯, 'КА', 13)─┐
│                        2 │
└──────────────────────────┘

extract

Добавлена в: v1.1

Извлекает первое совпадение регулярного выражения в строке. Если 'haystack' не соответствует 'pattern', возвращается пустая строка.

Эта функция использует библиотеку регулярных выражений RE2. См. re2 для поддерживаемого синтаксиса.

Если регулярное выражение содержит группы захвата (подшаблоны), функция использует первую группу захвата в качестве совпадения.

Синтаксис

extract(haystack, pattern)

Аргументы

  • haystack — Строка, из которой выполняется извлечение. String
  • pattern — Регулярное выражение, как правило, содержащее группу захвата. const String

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

Возвращает извлечённый фрагмент в виде строки. String

Примеры

Извлечение домена из адреса электронной почты

SELECT extract('test@clickhouse.com', '.*@(.*)$')
┌─extract('test@clickhouse.com', '.*@(.*)$')─┐
│ clickhouse.com                            │
└───────────────────────────────────────────┘

Если совпадений нет, возвращается пустая строка.

SELECT extract('test@clickhouse.com', 'no_match')
┌─extract('test@clickhouse.com', 'no_match')─┐
│                                            │
└────────────────────────────────────────────┘

extractAll

Добавлена в: v1.1

Как extract, но возвращает массив всех вхождений регулярного выражения в строке. Если 'haystack' не соответствует регулярному выражению 'pattern', возвращается пустой массив.

Если регулярное выражение содержит группы захвата (подшаблоны), функция возвращает совпадения для первой группы захвата.

Синтаксис

extractAll(haystack, pattern)

Аргументы

  • haystack — Строка, из которой нужно извлечь фрагменты. String
  • pattern — Регулярное выражение, при необходимости содержащее группы захвата. const String

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

Возвращает массив извлечённых фрагментов. Array(String)

Примеры

Извлечение всех чисел

SELECT extractAll('hello 123 world 456', '[0-9]+')
┌─extractAll('hello 123 world 456', '[0-9]+')─┐
│ ['123','456']                               │
└─────────────────────────────────────────────┘

Извлечение с использованием захватывающей группы

SELECT extractAll('test@example.com, user@domain.org', '([a-zA-Z0-9]+)@')
┌─extractAll('test@example.com, user@domain.org', '([a-zA-Z0-9]+)@')─┐
│ ['test','user']                                                    │
└────────────────────────────────────────────────────────────────────┘

extractAllGroupsHorizontal

Добавлено в версии: v20.5

Находит все группы в строке с помощью указанного регулярного выражения и возвращает массив массивов, где каждый внутренний массив содержит все захватывания одной и той же группы, расположенные по номеру группы.

Синтаксис

extractAllGroupsHorizontal(s, regexp)

Аргументы

  • s — Входная строка, из которой выполняется извлечение групп. String или FixedString
  • regexp — Регулярное выражение для сопоставления. const String или const FixedString

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

Возвращает массив массивов, где каждый внутренний массив содержит все захваченные подстроки одной группы захвата по всем совпадениям. Первый внутренний массив содержит все захваты из группы 1, второй — из группы 2 и т. д. Если совпадения не найдены, возвращается пустой массив. Array(Array(String))

Примеры

Пример использования

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroupsHorizontal(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','Date','Content-Type','Connection'],['nginx','Tue, 22 Jan 2019 00:26:14 GMT','text/html; charset=UTF-8','keep-alive']]

extractGroups

Введена в: v20.5

Извлекает все группы из непересекающихся подстрок, найденных по регулярному выражению.

Синтаксис

extractAllGroups(s, regexp)

Аргументы

  • s — Входная строка, из которой выполняется извлечение. String или FixedString
  • regexp — Регулярное выражение. Константное значение. const String или const FixedString

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

Если функция находит хотя бы одну совпадающую группу, она возвращает столбец типа Array(Array(String)), упорядоченный по group_id (1 до N, где N — количество захватывающих групп в regexp). Если совпадающих групп нет, возвращается пустой массив. Array(Array(String))

Примеры

Пример использования

WITH '< Server: nginx
< Date: Tue, 22 Jan 2019 00:26:14 GMT
< Content-Type: text/html; charset=UTF-8
< Connection: keep-alive
' AS s
SELECT extractAllGroups(s, '< ([\\w\\-]+): ([^\\r\\n]+)');
[['Server','nginx'],['Date','Tue, 22 Jan 2019 00:26:14 GMT'],['Content-Type','text/html; charset=UTF-8'],['Connection','keep-alive']]

hasAllTokens

Добавлена в: v25.10

Аналогично hasAnyTokens, но возвращает 1, если все токены в строке или массиве needle совпадают со строкой input, и 0 в противном случае. Если input — это столбец, возвращаются все строки, удовлетворяющие этому условию.

Примечание

Для столбца input должен быть определён текстовый индекс для оптимальной производительности. Если текстовый индекс не определён, функция выполняет полное сканирование столбца, которое на порядки медленнее, чем поиск по индексу.

Перед поиском функция выполняет токенизацию

  • аргумента input (всегда) и
  • аргумента needle (если он задан как String), используя токенизатор, указанный для текстового индекса. Если для столбца не определён текстовый индекс, вместо него используется токенизатор splitByNonAlpha. Если аргумент needle имеет тип Array(String), каждый элемент массива рассматривается как токен — дополнительная токенизация не выполняется.

Дубликаты токенов игнорируются. Например, needles = [&#39;ClickHouse&#39;, &#39;ClickHouse&#39;] обрабатывается так же, как [&#39;ClickHouse&#39;].

Синтаксис

hasAllTokens(input, needles)

Псевдонимы: hasAllToken

Аргументы

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

Возвращает 1, если все токены найдены, иначе — 0. UInt8

Примеры

Пример использования для строкового столбца

CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAllTokens(msg, 'a\\d()');
┌─count()─┐
│       1 │
└─────────┘

Укажите подстроки, которые нужно искать КАК ЕСТЬ (без токенизации) в массиве

SELECT count() FROM table WHERE hasAllTokens(msg, ['a', 'd']);
┌─count()─┐
│       1 │
└─────────┘

Генерация искомых подстрок с помощью функции tokens

SELECT count() FROM table WHERE hasAllTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
┌─count()─┐
│       1 │
└─────────┘

Примеры использования столбцов типов Array и Map

CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});

Пример со столбцом типа массив

SELECT count() FROM log WHERE hasAllTokens(tags, 'clickhouse');
┌─count()─┐
│       1 │
└─────────┘

Пример с функцией mapKeys

SELECT count() FROM log WHERE hasAllTokens(mapKeys(attributes), ['address', 'log_level']);
┌─count()─┐
│       1 │
└─────────┘

Пример использования mapValues

SELECT count() FROM log WHERE hasAllTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
┌─count()─┐
│       0 │
└─────────┘

hasAnyTokens

Добавлено в: v25.10

Возвращает 1, если хотя бы один токен в строке или массиве needle совпадает со строкой input, и 0 в противном случае. Если input — это столбец, возвращает все строки, удовлетворяющие этому условию.

Примечание

Для столбца input должен быть определён текстовый индекс для оптимальной производительности. Если текстовый индекс не определён, функция выполняет полное сканирование столбца, что на порядки медленнее, чем поиск по индексу.

Перед поиском функция выполняет токенизацию

  • аргумента input (всегда) и
  • аргумента needle (если он задан как String), используя токенизатор, указанный для текстового индекса. Если для столбца не определён текстовый индекс, вместо него используется токенизатор splitByNonAlpha. Если аргумент needle имеет тип Array(String), каждый элемент массива рассматривается как отдельный токен — дополнительная токенизация не выполняется.

Дублирующиеся токены игнорируются. Например, ['ClickHouse', 'ClickHouse'] обрабатывается так же, как ['ClickHouse'].

Синтаксис

hasAnyTokens(input, needles)

Псевдонимы: hasAnyToken

Аргументы

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

Возвращает 1, если было найдено хотя бы одно совпадение. 0 в противном случае. UInt8

Примеры

Пример использования для строкового столбца

CREATE TABLE table (
    id UInt32,
    msg String,
    INDEX idx(msg) TYPE text(tokenizer = splitByString(['()', '\\']))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO table VALUES (1, '()a,\\bc()d'), (2, '()\\a()bc\\d'), (3, ',()a\\,bc,(),d,');

SELECT count() FROM table WHERE hasAnyTokens(msg, 'a\\d()');
┌─count()─┐
│       3 │
└─────────┘

Укажите строки, которые следует искать «как есть» (без токенизации) в массиве

SELECT count() FROM table WHERE hasAnyTokens(msg, ['a', 'd']);
┌─count()─┐
│       3 │
└─────────┘

Сгенерируйте искомые токены с помощью функции tokens

SELECT count() FROM table WHERE hasAnyTokens(msg, tokens('a()d', 'splitByString', ['()', '\\']));
┌─count()─┐
│       3 │
└─────────┘

Примеры использования столбцов типов Array и Map

CREATE TABLE log (
    id UInt32,
    tags Array(String),
    attributes Map(String, String),
    INDEX idx_tags (tags) TYPE text(tokenizer = splitByNonAlpha),
    INDEX idx_attributes_keys mapKeys(attributes) TYPE text(tokenizer = array),
    INDEX idx_attributes_vals mapValues(attributes) TYPE text(tokenizer = array)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO log VALUES
    (1, ['clickhouse', 'clickhouse cloud'], {'address': '192.0.0.1', 'log_level': 'INFO'}),
    (2, ['chdb'], {'embedded': 'true', 'log_level': 'DEBUG'});

Пример со столбцом массива

SELECT count() FROM log WHERE hasAnyTokens(tags, 'clickhouse');
┌─count()─┐
│       1 │
└─────────┘

Пример с функцией mapKeys

SELECT count() FROM log WHERE hasAnyTokens(mapKeys(attributes), ['address', 'log_level']);
┌─count()─┐
│       2 │
└─────────┘

Пример использования mapValues

SELECT count() FROM log WHERE hasAnyTokens(mapValues(attributes), ['192.0.0.1', 'DEBUG']);
┌─count()─┐
│       2 │
└─────────┘

hasSubsequence

Впервые появилась в: v23.7

Проверяет, является ли needle подпоследовательностью haystack. Подпоследовательность строки — это последовательность, которую можно получить из другой строки путём удаления некоторых (или ни одного) символов без изменения порядка оставшихся символов.

Синтаксис

hasSubsequence(haystack, needle)

Аргументы

  • haystack — строка, в которой выполняется поиск подпоследовательности. String
  • needle — подпоследовательность, которую нужно найти. String

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

Возвращает 1, если needle является подпоследовательностью haystack, и 0 в противном случае. UInt8

Примеры

Базовая проверка наличия подпоследовательности

SELECT hasSubsequence('Hello World', 'HlWrd')
┌─hasSubsequence('Hello World', 'HlWrd')─┐
│                                      1 │
└────────────────────────────────────────┘

Подпоследовательность не найдена

SELECT hasSubsequence('Hello World', 'xyz')
┌─hasSubsequence('Hello World', 'xyz')─┐
│                                    0 │
└──────────────────────────────────────┘

hasSubsequenceCaseInsensitive

Добавлена в версии: v23.7

Аналог hasSubsequence, но выполняет поиск без учета регистра.

Синтаксис

hasSubsequenceCaseInsensitive(haystack, needle)

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle — подпоследовательность, которую нужно найти. String

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

Возвращает 1, если needle является подпоследовательностью haystack, и 0 в противном случае. UInt8

Примеры

Пример использования

SELECT hasSubsequenceCaseInsensitive('garbage', 'ARG');
┌─hasSubsequenceCaseInsensitive('garbage', 'ARG')─┐
│                                               1 │
└─────────────────────────────────────────────────┘

hasSubsequenceCaseInsensitiveUTF8

Появилась в версии: v23.7

Аналог функции hasSubsequenceUTF8, но выполняет поиск без учета регистра.

Синтаксис

hasSubsequenceCaseInsensitiveUTF8(haystack, needle)

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — строка-подпоследовательность в кодировке UTF-8, которую нужно найти. String

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

Возвращает 1, если needle является подпоследовательностью строки haystack, иначе 0. UInt8

Примеры

Пример использования

SELECT hasSubsequenceCaseInsensitiveUTF8('ClickHouse - столбцовая система управления базами данных', 'СИСТЕМА');
┌─hasSubsequen⋯ 'СИСТЕМА')─┐
│                        1 │
└──────────────────────────┘

hasSubsequenceUTF8

Добавлена в версии: v23.7

Аналог функции hasSubsequence, но предполагает, что haystack и needle — строки в кодировке UTF-8.

Синтаксис

hasSubsequenceUTF8(haystack, needle)

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle — подпоследовательность, которую нужно найти. String

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

Возвращает 1, если needle является подпоследовательностью haystack, в противном случае — 0. UInt8

Примеры

Пример использования

SELECT hasSubsequenceUTF8('картошка', 'кошка');
┌─hasSubsequen⋯', 'кошка')─┐
│                        1 │
└──────────────────────────┘

Подпоследовательность без совпадений

SELECT hasSubsequenceUTF8('картошка', 'апельсин');
┌─hasSubsequen⋯'апельсин')─┐
│                        0 │
└──────────────────────────┘

hasToken

Впервые появилась в: v20.1

Проверяет, присутствует ли заданный токен в строке.

Использует splitByNonAlpha в качестве токенизатора, то есть токен определяется как максимально длинная подпоследовательность идущих подряд символов [0-9A-Za-z_] (цифры, ASCII-символы и символ подчёркивания).

Синтаксис

hasToken(haystack, token)

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • token — Токен для поиска. const String

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

Возвращает 1, если токен найден, иначе 0. UInt8

Примеры

Поиск токена

SELECT hasToken('clickhouse test', 'test')
┌─hasToken('clickhouse test', 'test')─┐
│                                   1 │
└─────────────────────────────────────┘

hasTokenCaseInsensitive

Добавлена в версии: v

Выполняет регистронезависимый поиск значения needle в haystack с использованием индекса tokenbf_v1.

Синтаксис

Аргументы

  • Отсутствуют.

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

Примеры

hasTokenCaseInsensitiveOrNull

Введена в версии: v

Выполняет поиск needle в haystack без учета регистра с использованием индекса tokenbf_v1. Возвращает null, если needle задано некорректно.

Синтаксис

Аргументы

  • Отсутствуют.

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

Примеры

hasTokenOrNull

Впервые появился в версии v20.1

Аналог hasToken, но возвращает null, если токен имеет неверный формат.

Синтаксис

hasTokenOrNull(haystack, token)

Аргументы

  • haystack — Строка, в которой выполняется поиск. Должна быть константной. String
  • token — Токен для поиска. const String

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

Возвращает 1, если токен найден, 0 — в противном случае, null — если токен имеет неверный формат. Nullable(UInt8)

Примеры

Пример использования

SELECT hasTokenOrNull('apple banana cherry', 'ban ana');
┌─hasTokenOrNu⋯ 'ban ana')─┐
│                     ᴺᵁᴸᴸ │
└──────────────────────────┘

ilike

Добавлено в: v20.6

Аналог like, но выполняет регистронезависимый поиск.

Синтаксис

ilike(haystack, pattern)
-- haystack ILIKE pattern

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или FixedString
  • pattern — шаблон LIKE для поиска совпадений. String

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

Возвращает 1, если строка соответствует шаблону LIKE (без учета регистра), иначе 0. UInt8

Примеры

Пример использования

SELECT ilike('ClickHouse', '%house%');
┌─ilike('ClickHouse', '%house%')─┐
│                              1 │
└────────────────────────────────┘

like

Введено в: v1.1

Возвращает, соответствует ли строка haystack LIKE‑выражению pattern.

LIKE‑выражение может содержать обычные символы и следующие метасимволы:

  • % обозначает произвольное количество произвольных символов (включая ноль символов).
  • _ обозначает один произвольный символ.
  • \ используется для экранирования литералов %, _ и \.

Сопоставление выполняется в кодировке UTF-8, например, _ соответствует кодовой точке Unicode ¥, которая в UTF-8 представлена двумя байтами.

Если строка haystack или LIKE‑выражение не являются корректной строкой в кодировке UTF-8, поведение не определено.

Автоматическая нормализация Unicode не выполняется; для этого вы можете использовать функции normalizeUTF8*.

Чтобы сопоставлять литеральные %, _ и \ (которые являются метасимволами LIKE), добавьте перед ними обратную косую черту: \%, \_ и \\. Обратная косая черта теряет своё специальное значение (т. е. интерпретируется буквально), если она стоит перед символом, отличным от %, _ или \.

Примечание

ClickHouse требует также экранировать обратные косые черты в строках, поэтому фактически вам нужно написать \\%, \\_ и \\\\.

Для LIKE‑выражений вида %needle% функция работает так же быстро, как функция position. Все остальные выражения LIKE внутренне преобразуются в регулярное выражение и выполняются с производительностью, аналогичной функции match.

Синтаксис

like(haystack, pattern)
-- haystack LIKE pattern

Аргументы

  • haystack — строка, в которой выполняется поиск. String или FixedString
  • pattern — шаблон LIKE для сравнения. Может содержать % (соответствует любому количеству символов), _ (соответствует одному символу) и \ для экранирования. String

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

Возвращает 1, если строка соответствует шаблону LIKE, в противном случае — 0. UInt8

Примеры

Пример использования

SELECT like('ClickHouse', '%House');
┌─like('ClickHouse', '%House')─┐
│                            1 │
└──────────────────────────────┘

Подстановочный символ для одного символа

SELECT like('ClickHouse', 'Click_ouse');
┌─like('ClickH⋯lick_ouse')─┐
│                        1 │
└──────────────────────────┘

Отсутствие совпадения с шаблоном

SELECT like('ClickHouse', '%SQL%');
┌─like('ClickHouse', '%SQL%')─┐
│                           0 │
└─────────────────────────────┘

locate

Появилась в версии v18.16

Аналогична position, но с переставленными аргументами haystack и locate.

Поведение в разных версиях

Поведение этой функции зависит от версии ClickHouse:

  • в версиях < v24.3 locate была псевдонимом функции position и принимала аргументы (haystack, needle[, start_pos]);
  • в версиях >= 24.3 locate является отдельной функцией (для лучшей совместимости с MySQL) и принимает аргументы (needle, haystack[, start_pos]). Предыдущее поведение можно восстановить с помощью настройки function_locate_has_mysql_compatible_argument_order = false.

Синтаксис

locate(needle, haystack[, start_pos])

Аргументы

  • needle — Подстрока для поиска. String
  • haystack — Строка, в которой выполняется поиск. String или Enum
  • start_pos — Необязательный параметр. Позиция (начиная с 1) в haystack, с которой начинается поиск. UInt

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

Возвращает начальную позицию в байтах, считая от 1, если подстрока найдена, или 0, если подстрока не найдена. UInt64

Примеры

Базовое использование

SELECT locate('ca', 'abcabc')
┌─locate('ca', 'abcabc')─┐
│                      3 │
└────────────────────────┘

match

Добавлена в: v1.1

Проверяет, соответствует ли указанная строка заданному шаблону регулярного выражения.

Эта функция использует библиотеку регулярных выражений RE2. Поддерживаемый синтаксис смотрите в re2.

Сопоставление выполняется при предположении кодировки UTF-8, например, ¥ внутренне занимает два байта, но при сопоставлении рассматривается как один кодпоинт. Регулярное выражение не должно содержать нулевых байтов. Если haystack или шаблон не являются корректным UTF-8, поведение не определено.

В отличие от поведения по умолчанию re2, . сопоставляет также символы перевода строки. Чтобы отключить это, добавьте к шаблону префикс (?-s).

Шаблон автоматически «якорится» с обеих сторон (как если бы шаблон начинался с ^ и заканчивался на $).

Если вам нужно лишь находить подстроки, вы можете использовать функции like или position — они работают значительно быстрее, чем эта функция.

Альтернативный синтаксис оператора: haystack REGEXP pattern.

Синтаксис

match(haystack, pattern)

Псевдонимы: REGEXP_MATCHES

Аргументы

  • haystack — Строка, в которой выполняется поиск по шаблону. String
  • pattern — Шаблон регулярного выражения. const String

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

Возвращает 1, если строка соответствует шаблону, и 0 в противном случае. UInt8

Примеры

Базовое сопоставление с шаблоном

SELECT match('Hello World', 'Hello.*')
┌─match('Hello World', 'Hello.*')─┐
│                               1 │
└─────────────────────────────────┘

Нет совпадений с шаблоном

SELECT match('Hello World', 'goodbye.*')
┌─match('Hello World', 'goodbye.*')─┐
│                                 0 │
└───────────────────────────────────┘

multiFuzzyMatchAllIndices

Добавлена в: v20.1

Аналог multiFuzzyMatchAny, но возвращает массив всех индексов (в любом порядке), для которых соответствующая строка совпадает с «стогом сена» (haystack) в пределах заданного редакционного расстояния.

Синтаксис

multiFuzzyMatchAllIndices(haystack, distance, [pattern1, pattern2, ..., patternN])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • distance — максимальное редакционное расстояние для нечеткого сопоставления. UInt8
  • pattern — массив шаблонов для сопоставления. Array(String)

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

Возвращает массив всех индексов (начиная с 1) шаблонов, которые совпадают со строкой haystack в пределах указанного редакционного расстояния в произвольном порядке. Возвращает пустой массив, если совпадений не найдено. Array(UInt64)

Примеры

Пример использования

SELECT multiFuzzyMatchAllIndices('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose', 'House']);
┌─multiFuzzyMa⋯, 'House'])─┐
│ [3,1,4,2]                │
└──────────────────────────┘

multiFuzzyMatchAny

Добавлена в: v20.1

Как multiMatchAny, но возвращает 1, если любой шаблон совпадает с искомой строкой с учётом фиксированного редакционного расстояния. Эта функция опирается на экспериментальную возможность библиотеки hyperscan и может работать медленно в некоторых крайних случаях. Производительность зависит от значения редакционного расстояния и используемых шаблонов, но всегда ниже по сравнению с вариантами без нечеткого сопоставления.

Примечание

Семейство функций multiFuzzyMatch*() не поддерживает регулярные выражения в UTF-8 (обрабатывает их как последовательность байт) из‑за ограничений hyperscan.

Синтаксис

multiFuzzyMatchAny(haystack, distance, [pattern1, pattern2, ..., patternN])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • distance — Максимальное редакционное расстояние для нечёткого поиска. UInt8
  • pattern — Необязательный аргумент. Массив шаблонов для сопоставления. Array(String)

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

Возвращает 1, если хотя бы один шаблон совпадает со строкой haystack при указанном редакционном расстоянии, в противном случае — 0. UInt8

Примеры

Пример использования

SELECT multiFuzzyMatchAny('ClickHouse', 2, ['ClickHouse', 'ClckHouse', 'ClickHose']);
┌─multiFuzzyMa⋯lickHose'])─┐
│                        1 │
└──────────────────────────┘

multiFuzzyMatchAnyIndex

Введена в версии: v20.1

Аналог multiFuzzyMatchAny, но возвращает любой индекс совпадения в строке, по которой ведётся поиск, в пределах заданного константного редакционного расстояния.

Синтаксис

multiFuzzyMatchAnyIndex(haystack, distance, [pattern1, pattern2, ..., patternn])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • distance — максимальное редакционное расстояние для нечеткого сопоставления. UInt8
  • pattern — массив шаблонов для сопоставления. Array(String)

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

Возвращает индекс (начиная с 1) шаблона, совпадающего со строкой haystack в пределах указанного редакционного расстояния, иначе 0. UInt64

Примеры

Пример использования

SELECT multiFuzzyMatchAnyIndex('ClickHouse', 2, ['ClckHouse', 'ClickHose', 'ClickHouse']);
┌─multiFuzzyMa⋯ickHouse'])─┐
│                        2 │
└──────────────────────────┘

multiMatchAllIndices

Введена в версии v20.1

Аналог multiMatchAny, но возвращает массив всех индексов, которые совпадают с haystack в любом порядке.

Синтаксис

multiMatchAllIndices(haystack, [pattern1, pattern2, ..., patternn])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • pattern — регулярное выражение (шаблон) для сопоставления. String

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

Массив всех индексов (начиная с 1), соответствующих совпадениям в haystack, в любом порядке. Возвращает пустой массив, если совпадения не найдены. Array(UInt64)

Примеры

Пример использования

SELECT multiMatchAllIndices('ClickHouse', ['[0-9]', 'House', 'Click', 'ouse']);
┌─multiMatchAl⋯', 'ouse'])─┐
│ [3, 2, 4]                │
└──────────────────────────┘

multiMatchAny

Добавлена в версии: v20.1

Проверяет, соответствует ли хотя бы один из нескольких шаблонов регулярных выражений строке ("стогу сена").

Если вам нужно только искать несколько подстрок в строке, вместо этого можно использовать функцию multiSearchAny — она работает значительно быстрее, чем эта функция.

Синтаксис

multiMatchAny(haystack, pattern1[, pattern2, ...])

Аргументы

  • haystack — строка, в которой выполняется поиск по шаблонам. String
  • pattern1[, pattern2, ...] — массив из одного или нескольких шаблонов регулярных выражений. Array(String)

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

Возвращает 1, если есть совпадение с любым шаблоном, иначе 0. UInt8

Примеры

Сопоставление нескольких шаблонов

SELECT multiMatchAny('Hello World', ['Hello.*', 'foo.*'])
┌─multiMatchAny('Hello World', ['Hello.*', 'foo.*'])─┐
│                                                  1 │
└────────────────────────────────────────────────────┘

Нет совпадений с шаблонами

SELECT multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])
┌─multiMatchAny('Hello World', ['goodbye.*', 'foo.*'])─┐
│                                                    0 │
└──────────────────────────────────────────────────────┘

multiMatchAnyIndex

Введена в версии v20.1

Аналог multiMatchAny, но возвращает любой индекс шаблона, который совпадает с исходной строкой.

Синтаксис

multiMatchAnyIndex(haystack, [pattern1, pattern2, ..., patternn])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • pattern — регулярные выражения, по которым выполняется поиск. Array(String)

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

Возвращает индекс (начиная с 1) первого шаблона, для которого найдено совпадение, или 0, если совпадений не найдено. UInt64

Примеры

Пример использования

SELECT multiMatchAnyIndex('ClickHouse', ['[0-9]', 'House', 'Click']);
┌─multiMatchAn⋯, 'Click'])─┐
│                        3 │
└──────────────────────────┘

multiSearchAllPositions

Впервые представлена в: v20.1

Аналог функции position, но возвращает массив позиций (в байтах, начиная с 1) для нескольких подстрок needle в строке haystack.

Все функции multiSearch*() поддерживают не более 2^8 подстрок needle.

Синтаксис

multiSearchAllPositions(haystack, needle1[, needle2, ...])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • needle1[, needle2, ...] — Массив из одной или более подстрок для поиска. Array(String)

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

Возвращает массив начальных позиций подстрок в байтах (нумерация с 1), если подстрока была найдена, и 0, если подстрока не была найдена. Array(UInt64)

Примеры

Поиск нескольких подстрок

SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])
┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐
│ [0,13,0]                                                          │
└───────────────────────────────────────────────────────────────────┘

multiSearchAllPositionsCaseInsensitive

Впервые добавлена в: v20.1

Аналог multiSearchAllPositions, но не учитывает регистр.

Синтаксис

multiSearchAllPositionsCaseInsensitive(haystack, needle1[, needle2, ...])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle1[, needle2, ...] — массив из одной или нескольких подстрок, по которым ведется поиск. Array(String)

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

Возвращает массив начальных позиций в байтах, начиная с 1 (если подстрока была найдена), либо 0, если подстрока не найдена. Array(UInt64)

Примеры

Множественный поиск без учета регистра

SELECT multiSearchAllPositionsCaseInsensitive('ClickHouse',['c','h'])
┌─multiSearchA⋯['c', 'h'])─┐
│ [1,6]                    │
└──────────────────────────┘

multiSearchAllPositionsCaseInsensitiveUTF8

Появилась в версии v20.1

Аналог multiSearchAllPositionsUTF8, но игнорирует регистр.

Синтаксис

multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — подстроки в кодировке UTF-8, по которым выполняется поиск. Array(String)

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

Массив позиций начала подстроки в байтах, нумерация с 1 (если подстрока найдена). Возвращает 0, если подстрока не найдена. Array

Примеры

Регистронезависимый поиск в UTF-8

SELECT multiSearchAllPositionsCaseInsensitiveUTF8('Здравствуй, мир!', ['здравствуй', 'МИР']);
┌─multiSearchA⋯й', 'МИР'])─┐
│ [1, 13]                  │
└──────────────────────────┘

multiSearchAllPositionsUTF8

Впервые появилось в: v20.1

Аналог multiSearchAllPositions, но предполагает, что haystack и подстроки needle — это строки в кодировке UTF-8.

Синтаксис

multiSearchAllPositionsUTF8(haystack, needle1[, needle2, ...])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle1[, needle2, ...] — массив подстрок в кодировке UTF-8, которые нужно найти. Array(String)

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

Возвращает массив начальных позиций в байтах, нумерация с 1 (если подстрока найдена), либо 0, если подстрока не найдена. Array

Примеры

Множественный поиск в строках UTF-8

SELECT multiSearchAllPositionsUTF8('ClickHouse',['C','H'])
┌─multiSearchAllPositionsUTF8('ClickHouse', ['C', 'H'])─┐
│ [1,6]                                                 │
└───────────────────────────────────────────────────────┘

multiSearchAny

Добавлено в: v20.1

Проверяет, совпадает ли хотя бы одна из строк needle со строкой haystack.

Функции multiSearchAnyCaseInsensitive, multiSearchAnyUTF8 и multiSearchAnyCaseInsensitiveUTF8 предоставляют варианты этой функции, работающие без учета регистра и/или с кодировкой UTF-8.

Синтаксис

multiSearchAny(haystack, needle1[, needle2, ...])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle1[, needle2, ...] — массив искомых подстрок. Array(String)

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

Возвращает 1, если найдено хотя бы одно совпадение, иначе 0, если совпадений нет. UInt8

Примеры

Поиск при наличии хотя бы одного совпадения

SELECT multiSearchAny('ClickHouse',['C','H'])
┌─multiSearchAny('ClickHouse', ['C', 'H'])─┐
│                                        1 │
└──────────────────────────────────────────┘

multiSearchAnyCaseInsensitive

Впервые появилась в: v20.1

Аналог multiSearchAny, но выполняет поиск без учета регистра.

Синтаксис

multiSearchAnyCaseInsensitive(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle — подстроки, которые нужно найти. Array(String)

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

Возвращает 1, если найдено хотя бы одно совпадение без учета регистра, в противном случае — 0. UInt8

Примеры

Поиск без учета регистра

SELECT multiSearchAnyCaseInsensitive('ClickHouse',['c','h'])
┌─multiSearchAnyCaseInsensitive('ClickHouse', ['c', 'h'])─┐
│                                                       1 │
└─────────────────────────────────────────────────────────┘

multiSearchAnyCaseInsensitiveUTF8

Добавлена в версии: v20.1

Аналог multiSearchAnyUTF8, но игнорирует регистр.

Синтаксис

multiSearchAnyCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — подстроки в кодировке UTF-8, по которым выполняется поиск. Array(String)

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

Возвращает 1, если найдено хотя бы одно совпадение без учета регистра, в противном случае — 0. UInt8

Примеры

Для строки UTF-8 'Здравствуйте' проверьте, присутствует ли символ 'з' (в нижнем регистре)

SELECT multiSearchAnyCaseInsensitiveUTF8('Здравствуйте',['з'])
┌─multiSearchA⋯те', ['з'])─┐
│                        1 │
└──────────────────────────┘

multiSearchAnyUTF8

Введена в версии: v20.1

Аналог функции multiSearchAny, но предполагает, что haystack и подстроки needle являются строками в кодировке UTF-8.

Синтаксис

multiSearchAnyUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — подстроки в кодировке UTF-8, которые нужно найти. Array(String)

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

Возвращает 1, если найдено как минимум одно совпадение, в противном случае — 0. UInt8

Примеры

Для строки '你好,世界' ('Hello, world') в кодировке UTF-8 проверьте, есть ли в строке символы 你 или 界

SELECT multiSearchAnyUTF8('你好,世界', ['你', '界'])
┌─multiSearchA⋯你', '界'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstIndex

Появилась в: v20.1

Выполняет поиск нескольких строк-образцов в исходной строке (с учётом регистра) и возвращает индекс (начиная с 1) первого найденного образца.

Синтаксис

multiSearchFirstIndex(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • needles — Массив строк, по которым выполняется поиск. Array(String)

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

Возвращает индекс (позицию в массиве needles), начинающийся с 1, первой строки из needles, найденной в haystack. Возвращает 0, если ни одна строка не найдена. Поиск выполняется с учётом регистра. UInt64

Примеры

Пример использования

SELECT multiSearchFirstIndex('ClickHouse Database', ['Click', 'Database', 'Server']);
┌─multiSearchF⋯ 'Server'])─┐
│                        1 │
└──────────────────────────┘

Регистрозависимое поведение

SELECT multiSearchFirstIndex('ClickHouse Database', ['CLICK', 'Database', 'Server']);
┌─multiSearchF⋯ 'Server'])─┐
│                        2 │
└──────────────────────────┘

Совпадений не найдено

SELECT multiSearchFirstIndex('Hello World', ['goodbye', 'test']);
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘

multiSearchFirstIndexCaseInsensitive

Впервые представлена в: v20.1

Возвращает индекс i (начиная с 1) самой левой найденной подстроки needle_i в строке haystack, и 0 в противном случае. Игнорирует регистр.

Синтаксис

multiSearchFirstIndexCaseInsensitive(haystack, [needle1, needle2, ..., needleN]

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle — подстроки для поиска. Array(String)

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

Возвращает индекс (начиная с 1) самого левого найденного вхождения needle. В противном случае — 0, если совпадения не было. UInt8

Примеры

Пример использования

SELECT multiSearchFirstIndexCaseInsensitive('hElLo WoRlD', ['World', 'Hello']);
┌─multiSearchF⋯, 'Hello'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstIndexCaseInsensitiveUTF8

Добавлено в: v20.1

Выполняет поиск нескольких подстрок-образцов в строке‑«стоге сена» без учета регистра с поддержкой кодировки UTF-8 и возвращает индекс первого найденного образца (нумерация с 1).

Синтаксис

multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needles — массив строк для поиска. Array(String)

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

Возвращает индекс, начинающийся с 1 (позицию в массиве needles) первой строки, найденной в haystack. Возвращает 0, если ни одна из строк не найдена. Поиск нечувствителен к регистру и учитывает кодировку символов UTF-8. UInt64

Примеры

Пример использования

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('ClickHouse Database', ['CLICK', 'data', 'server']);
┌─multiSearchF⋯ 'server'])─┐
│                        1 │
└──────────────────────────┘

Учет регистра в UTF-8

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Привет Мир', ['мир', 'ПРИВЕТ']);
┌─multiSearchF⋯ 'ПРИВЕТ'])─┐
│                        1 │
└──────────────────────────┘

Совпадений не найдено

SELECT multiSearchFirstIndexCaseInsensitiveUTF8('Hello World', ['goodbye', 'test']);
┌─multiSearchF⋯', 'test'])─┐
│                        0 │
└──────────────────────────┘

multiSearchFirstIndexUTF8

Появилась в версии: v20.1

Возвращает индекс i (начиная с 1) самого левого вхождения needle&#95;i в строке haystack или 0, если совпадений нет. Предполагается, что haystack и needle — строки в кодировке UTF-8.

Синтаксис

multiSearchFirstIndexUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — массив подстрок в кодировке UTF-8, по которым выполняется поиск. Array(String)

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

Возвращает индекс (начиная с 1) самой левой найденной подстроки. В противном случае возвращает 0, если совпадений не было. UInt8

Примеры

Пример использования

SELECT multiSearchFirstIndexUTF8('Здравствуйте мир', ['мир', 'здравствуйте']);
┌─multiSearchF⋯вствуйте'])─┐
│                        1 │
└──────────────────────────┘

multiSearchFirstPosition

Введена в: v20.1

Аналог функции position, но возвращает смещение от начала строки haystack до самого левого вхождения любой из нескольких строк needle.

Функции multiSearchFirstPositionCaseInsensitive, multiSearchFirstPositionUTF8 и multiSearchFirstPositionCaseInsensitiveUTF8 предоставляют регистронезависимые и/или UTF-8-варианты этой функции.

Синтаксис

multiSearchFirstPosition(haystack, needle1[, needle2, ...])

Аргументы

  • haystack — строка, в которой выполняется поиск. String
  • needle1[, needle2, ...] — массив из одной или более подстрок, по которым выполняется поиск. Array(String)

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

Возвращает смещение от начала строки haystack, соответствующее любой из подстрок needle. В случае отсутствия совпадений возвращает 0. UInt64

Примеры

Поиск позиции первого вхождения

SELECT multiSearchFirstPosition('Hello World',['llo', 'Wor', 'ld'])
┌─multiSearchFirstPosition('Hello World', ['llo', 'Wor', 'ld'])─┐
│                                                             3 │
└───────────────────────────────────────────────────────────────┘

multiSearchFirstPositionCaseInsensitive

Впервые появилась в версии v20.1

Аналог multiSearchFirstPosition, но без учета регистра.

Синтаксис

multiSearchFirstPositionCaseInsensitive(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • needle — Массив подстрок, по которым выполняется поиск. Array(String)

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

Возвращает наименьшее (самое левое) смещение в строке haystack, где найдено совпадение с любой из строк needle. Возвращает 0, если совпадений не было. UInt64

Примеры

Первое вхождение без учета регистра

SELECT multiSearchFirstPositionCaseInsensitive('HELLO WORLD',['wor', 'ld', 'ello'])
┌─multiSearchFirstPositionCaseInsensitive('HELLO WORLD', ['wor', 'ld', 'ello'])─┐
│                                                                             2 │
└───────────────────────────────────────────────────────────────────────────────┘

multiSearchFirstPositionCaseInsensitiveUTF8

Впервые появилась в версии v20.1

Аналог multiSearchFirstPosition, но предполагает, что haystack и needle — строки в кодировке UTF-8, и игнорирует регистр.

Синтаксис

multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в кодировке UTF-8, в которой выполняется поиск. String
  • needle — массив подстрок в кодировке UTF-8, по которым выполняется поиск. Array(String)

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

Возвращает самую левую позицию в строке haystack, которая совпадает с любой из строк needle, без учета регистра. Возвращает 0, если совпадение не найдено. UInt64

Примеры

Найти самую левую позицию в строке UTF-8 'Здравствуй, мир' ('Hello, world'), которая совпадает с любой из указанных подстрок

SELECT multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['МИР', 'вст', 'Здра'])
┌─multiSearchFirstPositionCaseInsensitiveUTF8('Здравствуй, мир', ['мир', 'вст', 'Здра'])─┐
│                                                                                      3 │
└────────────────────────────────────────────────────────────────────────────────────────┘

multiSearchFirstPositionUTF8

Появилась в версии: v20.1

Аналог multiSearchFirstPosition, но предполагает, что haystack и needle — строки в кодировке UTF-8.

Синтаксис

multiSearchFirstPositionUTF8(haystack, [needle1, needle2, ..., needleN])

Аргументы

  • haystack — строка в UTF-8, в которой выполняется поиск. String
  • needle — массив подстрок в UTF-8, по которым выполняется поиск. Array(String)

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

Наименьшее (самое левое) смещение в строке haystack, в котором есть совпадение с любой из строк needle. Возвращает 0, если совпадений нет. UInt64

Примеры

Найдите наименьшее (самое левое) смещение в строке UTF-8 'Здравствуй, мир' ('Hello, world'), которое совпадает с любой из заданных подстрок

SELECT multiSearchFirstPositionUTF8('Здравствуй, мир',['мир', 'вст', 'авст'])
┌─multiSearchFirstPositionUTF8('Здравствуй, мир', ['мир', 'вст', 'авст'])─┐
│                                                                       3 │
└─────────────────────────────────────────────────────────────────────────┘

ngramDistance

Впервые появилась в версии v20.1

Вычисляет расстояние по 4-граммам между двумя строками. Для этого считает симметрическую разность между двумя мультимножествами 4-грамм и нормализует её по сумме их мощностей. Чем меньше возвращаемое значение, тем более похожи строки.

Для поиска без учета регистра и/или в формате UTF8 используйте функции ngramDistanceCaseInsensitive, ngramDistanceUTF8, ngramDistanceCaseInsensitiveUTF8.

Синтаксис

ngramDistance(haystack, needle)

Аргументы

  • haystack — строка для сравнения. String
  • needle — строка для сравнения. String

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

Возвращает число типа Float32 в диапазоне от 0 до 1. Чем меньше возвращаемое значение, тем более похожи строки. Float32

Примеры

Вычисление расстояния на основе 4-грамм

SELECT ngramDistance('ClickHouse', 'ClickHouses')
┌─ngramDistance('ClickHouse', 'ClickHouses')─┐
│                                        0.1 │
└────────────────────────────────────────────┘

ngramDistanceCaseInsensitive

Впервые представлена в: v20.1

Предоставляет регистронезависимый вариант ngramDistance. Вычисляет расстояние на основе 4-грамм между двумя строками, игнорируя регистр. Чем меньше возвращаемое значение, тем более похожи строки.

Синтаксис

ngramDistanceCaseInsensitive(haystack, needle)

Аргументы

  • haystack — первая сравниваемая строка. String
  • needle — вторая сравниваемая строка. String

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

Возвращает число с плавающей запятой типа Float32 в диапазоне от 0 до 1. Float32

Примеры

Регистронезависимое 4-граммное расстояние

SELECT ngramDistanceCaseInsensitive('ClickHouse','clickhouse')
┌─ngramDistanceCaseInsensitive('ClickHouse','clickhouse')─┐
│                                                       0 │
└─────────────────────────────────────────────────────────┘

ngramDistanceCaseInsensitiveUTF8

Впервые представлена в: v20.1

Предоставляет регистронезависимый вариант UTF-8 функции ngramDistance. Предполагается, что строки needle и haystack закодированы в UTF-8, при этом регистр игнорируется. Вычисляет расстояние по 3-граммам между двумя строками в кодировке UTF-8 с игнорированием регистра. Чем меньше возвращаемое значение, тем более похожи строки.

Синтаксис

ngramDistanceCaseInsensitiveUTF8(haystack, needle)

Аргументы

  • haystack — первая сравниваемая строка в кодировке UTF-8. String
  • needle — вторая сравниваемая строка в кодировке UTF-8. String

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

Возвращает число типа Float32 в диапазоне от 0 до 1. Float32

Примеры

Регистронезависимое расстояние 3-грамм в UTF-8

SELECT ngramDistanceCaseInsensitiveUTF8('abcde','CDE')
┌─ngramDistanceCaseInsensitiveUTF8('abcde','CDE')─┐
│                                             0.5 │
└─────────────────────────────────────────────────┘

ngramDistanceUTF8

Введена в версии v20.1

Предоставляет вариант функции ngramDistance для строк в кодировке UTF‑8. Предполагается, что строки needle и haystack закодированы в UTF‑8. Вычисляет расстояние по 3-граммам между двумя строками UTF‑8. Чем меньше возвращаемое значение, тем более похожи строки.

Синтаксис

ngramDistanceUTF8(haystack, needle)

Аргументы

  • haystack — первая сравниваемая строка в кодировке UTF-8. String
  • needle — вторая сравниваемая строка в кодировке UTF-8. String

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

Возвращает число типа Float32 в диапазоне от 0 до 1. Float32

Примеры

3-граммное расстояние UTF-8

SELECT ngramDistanceUTF8('abcde','cde')
┌─ngramDistanceUTF8('abcde','cde')─┐
│                               0.5 │
└───────────────────────────────────┘

ngramSearch

Введена в версии v20.1

Проверяет, что расстояние по 4-граммам между двумя строками меньше либо равно заданному порогу.

Для нечувствительного к регистру поиска и/или работы с UTF-8 используйте функции ngramSearchCaseInsensitive, ngramSearchUTF8, ngramSearchCaseInsensitiveUTF8.

Синтаксис

ngramSearch(haystack, needle)

Аргументы

  • haystack — Строка для сравнения. String
  • needle — Строка для сравнения. String

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

Возвращает 1, если расстояние по 4-граммам между строками меньше либо равно порогу (1.0 по умолчанию), иначе 0. UInt8

Примеры

Поиск с использованием 4-грамм

SELECT ngramSearch('ClickHouse', 'Click')
┌─ngramSearch('ClickHouse', 'Click')─┐
│                                  1 │
└────────────────────────────────────┘

ngramSearchCaseInsensitive

Добавлена в версии: v20.1

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

Синтаксис

ngramSearchCaseInsensitive(haystack, needle)

Аргументы

  • haystack — Строка, в которой выполняется поиск. String
  • needle — Искомая строка. String

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

Возвращает 1, если расстояние по 4-граммам между строками меньше или равно пороговому значению (1.0 по умолчанию), иначе 0. UInt8

Примеры

Поиск без учета регистра с использованием 4-грамм

SELECT ngramSearchCaseInsensitive('Hello World','hello')
┌─ngramSearchCaseInsensitive('Hello World','hello')─┐
│                                                  1 │
└────────────────────────────────────────────────────┘

ngramSearchCaseInsensitiveUTF8

Добавлена в версии: v20.1

Предоставляет регистронезависимый UTF-8-вариант ngramSearch. Предполагается, что haystack и needle — это строки в кодировке UTF-8, и регистр в них игнорируется. Проверяет, что расстояние по 3-граммам между двумя строками UTF-8 меньше либо равно заданному порогу, игнорируя регистр.

Синтаксис

ngramSearchCaseInsensitiveUTF8(haystack, needle)

Аргументы

  • haystack — строка в кодировке UTF-8 для сравнения. String
  • needle — строка в кодировке UTF-8 для сравнения. String

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

Возвращает 1, если расстояние на основе 3-грамм между строками меньше или равно пороговому значению (1.0 по умолчанию), и 0 в противном случае. UInt8

Примеры

Нечувствительный к регистру поиск в строках UTF-8 с использованием 3-грамм

SELECT ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')
┌─ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз')─┐
│                                                        1 │
└──────────────────────────────────────────────────────────┘

ngramSearchUTF8

Появилась в: v20.1

Предоставляет вариант функции ngramSearch для строк в кодировке UTF-8. Предполагает, что haystack и needle — строки в кодировке UTF-8. Проверяет, что расстояние по 3-граммам между двумя строками UTF-8 меньше или равно заданному порогу.

Синтаксис

ngramSearchUTF8(haystack, needle)

Аргументы

  • haystack — строка в кодировке UTF-8 для сравнения. String
  • needle — строка в кодировке UTF-8 для сравнения. String

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

Возвращает 1, если расстояние по 3-граммам между строками меньше либо равно порогу (1.0 по умолчанию), иначе 0. UInt8

Примеры

Поиск в UTF-8 с использованием 3-грамм

SELECT ngramSearchUTF8('абвгдеёжз', 'гдеёзд')
┌─ngramSearchUTF8('абвгдеёжз', 'гдеёзд')─┐
│                                      1 │
└────────────────────────────────────────┘

notILike

Появилась в версии: v20.6

Проверяет, что строка не соответствует шаблону без учета регистра. Шаблон может содержать специальные символы % и _ для сопоставления в стиле SQL LIKE.

Синтаксис

notILike(haystack, pattern)

Аргументы

  • haystack — входная строка, в которой выполняется поиск. String или FixedString
  • pattern — шаблон SQL LIKE для сравнения. % соответствует любому количеству символов (включая ноль), _ соответствует ровно одному символу. String

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

Возвращает 1, если строка не соответствует шаблону (сравнение без учета регистра), иначе 0. UInt8

Примеры

Пример использования

SELECT notILike('ClickHouse', '%house%');
┌─notILike('Cl⋯ '%house%')─┐
│                        0 │
└──────────────────────────┘

notLike

Введён в: v1.1

Похож на like, но возвращает противоположный результат.

Синтаксис

notLike(haystack, pattern)
-- haystack NOT LIKE pattern

Аргументы

  • haystack — строка, в которой выполняется поиск. String или FixedString
  • pattern — шаблон LIKE для проверки соответствия. String

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

Возвращает 1, если строка не соответствует шаблону LIKE, в противном случае — 0. UInt8

Примеры

Пример использования

SELECT notLike('ClickHouse', '%House%');
┌─notLike('Cli⋯ '%House%')─┐
│                        0 │
└──────────────────────────┘

Отсутствие совпадения с шаблоном

SELECT notLike('ClickHouse', '%SQL%');
┌─notLike('Cli⋯', '%SQL%')─┐
│                        1 │
└──────────────────────────┘

position

Введена в версии: v1.1

Возвращает позицию (в байтах, начиная с 1) подстроки needle в строке haystack.

Если подстрока needle пуста, применяются следующие правила:

  • если start_pos не указан: возвращается 1;
  • если start_pos = 0: возвращается 1;
  • если start_pos >= 1 и start_pos <= length(haystack) + 1: возвращается start_pos;
  • иначе: возвращается 0.

Те же правила также применяются к функциям locate, positionCaseInsensitive, positionUTF8 и positionCaseInsensitiveUTF8.

Синтаксис

position(haystack, needle[, start_pos])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или Enum
  • needle — Подстрока для поиска. String
  • start_pos — Позиция (нумерация с 1) в haystack, с которой начинается поиск. Необязательный параметр. UInt

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

Возвращает начальную позицию в байтах, считая с 1, если подстрока найдена; в противном случае — 0, если подстрока не найдена. UInt64

Примеры

Базовое использование

SELECT position('Hello, world!', '!')
┌─position('Hello, world!', '!')─┐
│                             13 │
└────────────────────────────────┘

С аргументом start_pos

SELECT position('Hello, world!', 'o', 1), position('Hello, world!', 'o', 7)
┌─position('Hello, world!', 'o', 1)─┬─position('Hello, world!', 'o', 7)─┐
│                                 5 │                                 9 │
└───────────────────────────────────┴───────────────────────────────────┘

Синтаксис «иголка IN стоге сена»

SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s)
┌─equals(6, position(s, '/'))─┐
│                           1 │
└─────────────────────────────┘

Пустая подстрока-шаблон

SELECT position('abc', ''), position('abc', '', 0), position('abc', '', 1), position('abc', '', 2), position('abc', '', 3), position('abc', '', 4), position('abc', '', 5)
┌─position('abc', '')─┬─position('abc', '', 0)─┬─position('abc', '', 1)─┬─position('abc', '', 2)─┬─position('abc', '', 3)─┬─position('abc', '', 4)─┬─position('abc', '', 5)─┐
│                   1 │                      1 │                      1 │                      2 │                      3 │                      4 │                      0 │
└─────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┘

positionCaseInsensitive

Добавлена в версии: v1.1

Аналог функции position, но без учета регистра.

Синтаксис

positionCaseInsensitive(haystack, needle[, start_pos])

Псевдонимы: instr

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или Enum
  • needle — Подстрока, которую нужно найти. String
  • start_pos — Необязательный параметр. Позиция (счёт с 1) в haystack, с которой начинается поиск. UInt*

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

Возвращает начальную позицию в байтах, считая с 1, если подстрока найдена, и 0, если подстрока не найдена. UInt64

Примеры

Поиск без учёта регистра

SELECT positionCaseInsensitive('Hello, world!', 'hello')
┌─positionCaseInsensitive('Hello, world!', 'hello')─┐
│                                                 1 │
└───────────────────────────────────────────────────┘

positionCaseInsensitiveUTF8

Введена в версии v1.1

Аналог positionUTF8, но выполняет поиск без учета регистра.

Синтаксис

positionCaseInsensitiveUTF8(haystack, needle[, start_pos])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или Enum
  • needle — Подстрока, которую нужно найти. String
  • start_pos — Необязательный параметр. Позиция (начиная с 1) в haystack, с которой начинается поиск. UInt*

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

Возвращает начальную позицию (в байтах, начиная с 1), если подстрока была найдена, в противном случае — 0. UInt64

Примеры

Регистронезависимый поиск в UTF-8

SELECT positionCaseInsensitiveUTF8('Привет мир', 'МИР')
┌─positionCaseInsensitiveUTF8('Привет мир', 'МИР')─┐
│                                                8 │
└──────────────────────────────────────────────────┘

positionUTF8

Появилась в версии: v1.1

Аналог функции position, но предполагается, что haystack и needle — строки в кодировке UTF-8.

Синтаксис

positionUTF8(haystack, needle[, start_pos])

Аргументы

  • haystack — Строка, в которой выполняется поиск. String или Enum
  • needle — Подстрока, которую нужно найти. String
  • start_pos — Необязательный параметр. Позиция (нумерация с 1) в haystack, с которой начинается поиск. UInt*

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

Возвращает начальную позицию подстроки в байтах (нумерация с 1), если подстрока найдена, в противном случае — 0. UInt64

Примеры

Подсчёт символов в кодировке UTF-8

SELECT positionUTF8('Motörhead', 'r')
┌─position('Motörhead', 'r')─┐
│                          5 │
└────────────────────────────┘