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

COUNT_SUBSTRINGS

Описание​

Функция COUNT_SUBSTRINGS подсчитывает количество вхождений заданной подстроки в строку. Примечание: при обнаружении совпадения текущая реализация продолжает поиск, смещаясь на длину подстроки. Например, при str='ccc' и pattern='cc' возвращается результат 1.

Синтаксис​

COUNT_SUBSTRINGS(<str>, <pattern>[, <start_pos>])

Параметры​

ПараметрОписание
<str>Строка, в которой выполняется поиск. Тип: STRING
<pattern>Подстрока для поиска. Тип: STRING
<start_pos>Позиция начала поиска (нумерация с 1). Тип: INT. Необязательный параметр

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

Возвращает значение типа INT, равное количеству вхождений подстроки в строку.

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

  • Если str имеет значение NULL, возвращается NULL
  • Если pattern является пустой строкой, возвращается 0
  • Если str является пустой строкой, возвращается 0
  • Если start_pos меньше или равен 0 либо превышает длину строки, возвращается 0
  • Если pattern длиннее str (или оставшейся части str, начиная с позиции start_pos), возвращается 0
Изменение поведения (4.1.4)

В версии 4.1.4 исправлена ошибка поиска совпадения с выходом за границы строки: если оставшихся символов не хватало для полной подстроки pattern, предыдущие версии могли всё же засчитать одно лишнее вхождение. Например, count_substrings('ab', 'abc') в предыдущих версиях мог возвращать 1, а после исправления корректно возвращает 0; count_substrings('ccc', 'cc', 3) после исправления возвращает 0.

Примеры​

  1. Базовое использование
SELECT count_substrings('a1b1c1d', '1');
+----------------------------------+
| count_substrings('a1b1c1d', '1') |
+----------------------------------+
| 3 |
+----------------------------------+
  1. Пример с последовательными запятыми
SELECT count_substrings(',,a,b,c,', ',');
+-----------------------------------+
| count_substrings(',,a,b,c,', ',') |
+-----------------------------------+
| 5 |
+-----------------------------------+
  1. Пример с перекрывающимися подстроками
SELECT count_substrings('ccc', 'cc');
+--------------------------------+
| count_substrings('ccc', 'cc') |
+--------------------------------+
| 1 |
+--------------------------------+
  1. Обработка значения NULL
SELECT count_substrings(NULL, ',');
+-----------------------------+
| count_substrings(NULL, ',') |
+-----------------------------+
| NULL |
+-----------------------------+
  1. Обработка пустой строки
SELECT count_substrings('a,b,c,abcde', '');
+-------------------------------------+
| count_substrings('a,b,c,abcde', '') |
+-------------------------------------+
| 0 |
+-------------------------------------+
  1. Использование параметра начальной позиции
SELECT count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 1), 
count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 6);
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 1) | count_substrings('ṭṛì ḍḍumai ṭṛì ti ḍḍumannàri', 'ḍḍu', 6) |
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| 2 | 1 |
+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
  1. Начальная позиция вне допустимого диапазона
SELECT count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 0), 
count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 30);
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 0) | count_substrings('éèêëìíîïðñòó éèêëìíîïðñòó', 'éèê', 30) |
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| 0 | 0 |
+------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
  1. Многобайтовая китайская подстрока с указанием начальной позиции
SELECT count_substrings('你好,世界!你好,世界!', '世界', 0), 
count_substrings('你好,世界!你好,世界!', '世界', 30);
+-----------------------------------------------------------------------+------------------------------------------------------------------------+
| count_substrings('你好,世界!你好,世界!', '世界', 0) | count_substrings('你好,世界!你好,世界!', '世界', 30) |
+-----------------------------------------------------------------------+------------------------------------------------------------------------+
| 0 | 0 |
+-----------------------------------------------------------------------+------------------------------------------------------------------------+