Как извлечь число после ключа в строке с помощью REGEXP_SUBSTR в MySQL

    При работе с текстовыми данными в MySQL часто возникает задача извлечения определённых значений, например, числа, следующего за ключом "10":. Использование функции REGEXP_SUBSTR с регулярными выражениями может приводить к неожиданным результатам, особенно если не учитывать особенности нумерации групп. Рассмотрим типичную проблему и её решение.

    Почему REGEXP_SUBSTR возвращает NULL или не ту часть?

    В исходном запросе SELECT REGEXP_SUBSTR('{"10":19656,"11":19658}', '"10":(\\d+)', 1, 2) указан параметр occurrence (вхождение) равный 2. Это означает, что функция пытается найти второе совпадение всего шаблона, а не первую группу. В строке есть только одно совпадение для "10":\d+, поэтому возвращается NULL.

    Правильный способ извлечения числа после ключа

    Чтобы получить число 19656, нужно извлечь первое вхождение шаблона и указать номер группы. В MySQL REGEXP_SUBSTR возвращает совпадение целиком, если не задан параметр группы. Для извлечения подмаски (группы) используйте REGEXP_SUBSTR с указанием группы в четвёртом аргументе (начиная с MySQL 8.0).

    SELECT REGEXP_SUBSTR('{"10":19656,"11":19658}', '"10":(\\d+)', 1, 1, NULL, 1);

    Здесь:
    1 - начальная позиция,
    1 - номер вхождения (первое),
    NULL - модификатор (не используется),
    1 - номер группы (первая скобочная группа). Результат: 19656.

    Альтернативные подходы без регулярных выражений

    Если строка имеет строгий формат JSON, проще использовать встроенные функции работы с JSON:

    • JSON_EXTRACT - извлекает значение по пути: SELECT JSON_EXTRACT('{"10":19656}', '$.10') вернёт 19656.
    • JSON_UNQUOTE - удаляет кавычки, если нужно строковое значение.
    • ->> оператор - сокращённая запись: SELECT '{"10":19656}' ->> '$.10'.

    Эти методы более надёжны и производительны для JSON-данных.

    Частые ошибки при использовании REGEXP_SUBSTR

    Ошибка 1: путаница между номером вхождения и номером группы.
    Ошибка 2: экранирование обратной косой черты. В строке SQL нужно удваивать \, чтобы получить один символ \ в регулярном выражении.
    Ошибка 3: использование REGEXP_SUBSTR в старых версиях MySQL (до 8.0), где функция отсутствует.

    Заключение

    Для извлечения числа после ключа "10": в MySQL используйте REGEXP_SUBSTR с правильным указанием группы или, ещё лучше, функции для работы с JSON. Это избавит от путаницы с вхождениями и повысит читаемость кода.

    Часто задаваемые вопросы