Подсчет символов в строке Oracle: функции и методы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчета количества вхождений символа в строку в Oracle используйте функции LENGTH и REPLACE. От длины исходной строки отнимите длину строки, из которой удалён данный символ (REPLACE(column, 'char', '')). Получите желаемую разницу.

SQL
Скопировать код
SELECT LENGTH(column) – LENGTH(REPLACE(column, 'char', '')) AS char_count FROM table;

Пример: посчитаем количество 'a' в 'bananas':

SQL
Скопировать код
SELECT LENGTH('bananas') – LENGTH(REPLACE('bananas', 'a', '')) AS char_count FROM dual;

Таким образом, char_count = 3 – это ответ!

Кинга Идем в IT: пошаговый план для смены профессии

Будьте внимательны к особым случаям

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

Справляясь с отсутствием значения 🌌

Если в вашей колонке могут присутствовать пустые значения, используйте COALESCE, чтобы заменить NULL на 0:

SQL
Скопировать код
SELECT COALESCE(LENGTH(column) – LENGTH(REPLACE(column, 'char', '')), 0) AS char_count FROM table;

Так NULL учитывается как 0.

В случае строки, заполненной одним символом

Если вся строка состоит из исключительно подсчитываемых символов:

SQL
Скопировать код
SELECT CASE
         WHEN column = RPAD('char', LENGTH(column), 'char') THEN LENGTH(column)
         ELSE LENGTH(column) – LENGTH(REPLACE(column, 'char', ''))
       END AS char_count FROM table;

С этим подходом строка 'aaaaa' будет иметь результат 5, ведь мы считаем символы, как овец перед сном, но без самого сна! 🐑

Когда функции REPLACE недостаточно

Если подсчитываемый символ может быть частью регулярного выражения, REGEXP_COUNT придет на помощь для более точного подсчета:

SQL
Скопировать код
SELECT REGEXP_COUNT(column, 'char') AS char_count FROM table;

Выполняйте подсчет с помощью мощи регулярных выражений! 🧙‍♂️

Визуализация

SQL – не только сухие данные. Иногда полезно визуализировать результаты:

Markdown
Скопировать код
Столбец: "apple"
Подсчет 'p': 🍎🍎 (Найдено 2)

С помощью SQL запроса:

SQL
Скопировать код
SELECT LENGTH(column) – LENGTH(REPLACE(column, 'p', '')) AS Count_of_p FROM FruitColumn;

Количество 'p' в "apple" будет выглядеть так:

Markdown
Скопировать код
| Символ | Количество |
| ------- | ---------- |
| 'p'     |     2      |

Погружение в создание пользовательских функций

Если стандартные функции не справляются, пришло время создавать свои!

Мастерство создания пользовательских функций

Напишите функцию EXPRESSION_COUNT, которая позволит гибко подсчитывать вхождения с точным контролем:

SQL
Скопировать код
CREATE FUNCTION EXPRESSION_COUNT(str IN VARCHAR2, expr IN VARCHAR2) RETURN NUMBER IS
  count NUMBER := 0;
  pos NUMBER := 1;
BEGIN
  LOOP
    pos := INSTR(str, expr, pos);
    IF pos = 0 THEN
      EXIT; -- "Мне пора уходить, мой народ нуждается во мне!"
    ELSE
      count := count + 1;
      pos := pos + LENGTH(expr); -- продолжаем движение вперед
    END IF;
  END LOOP;
  RETURN count; -- Возвращаем результат!
END;

SUBSTR – наш хирург по символам

Используйте SUBSTR, чтобы точно подсчитывать символы:

SQL
Скопировать код
SELECT SUM(CASE WHEN SUBSTR(column, level, 1) = 'char' THEN 1 ELSE 0 END) AS char_count
FROM table,
  TABLE(CAST(MULTISET(SELECT LEVEL FROM dual CONNECT BY LEVEL <= LENGTH(column)) AS sys.OdciNumberList))
GROUP BY column;

Не ограничивайтесь одним символом

Не остановитесь на подсчете только символов, вы можете подсчитывать и целые фразы!

SQL
Скопировать код
SELECT REGEXP_COUNT(column, 'phrase') AS phrase_count FROM table;

Ведь слова часто значат больше, чем одиночные символы! 📚

Полезные материалы

  1. REGEXP_COUNT — Официальная документация Oracle REGEXP_COUNT.
  2. string – MySQL – length() vs char_length() – Stack Overflow — Разные способы подсчета символов, примеры из MySQL.
  3. LAST_VALUE — Инструкция Oracle для функции LENGTH.
  4. Interesting SQL techniques — Тема не связана, но полезная для осознания подходов к подсчету в SQL.
  5. Oracle SQL Tips — Погружение в рабочий мир со строками в SQL.