Каков эквивалент REGEXP_SUBSTR в mysql?

Я хочу извлечь слово из строкового столбца таблицы.

description
===========================
abc order_id: 2 xxxx yyy aa
mmm order_id: 3 nn kk yw

Ожидаемый набор результатов

order_id
===========================
2
3

Таблица будет самое большее иметь 100 строк, текстовая длина является ~256 символами, и столбец всегда имеет тот order_id существующий. Таким образом, производительность не является проблемой.

В Oracle я могу использовать REGEXP_SUBSTR для этой проблемы. Как я решил бы это в MySQL?

Редактирование 1

Я использую, РАСПОЛАГАЮТСЯ и SUBSTR для решения проблемы. Код ужасен. Спустя десять минут после написания кода, я проклинаю парня, который написал такой ужасный код.

Я не нашел функцию REGEXP_SUBSTR в документах MySQL. Но я надеюсь, что это существует..

Ответ на: Почему наклон таблица быть оптимизированным? Почему данные хранятся таким немым способом?

Пример, который я дал просто, обозначает проблему, которую я пытаюсь решить. В реальном сценарии я использую основанное на DB стороннее программное обеспечение организации очередей для выполнения асинхронных задач. Очередь сериализирует объект Ruby как текст. Я не имею никакого контроля над структурой таблицы ИЛИ форматом данных. Задачи в очереди могут повторяться. В нашей тестовой установке некоторые повторяющиеся задачи перестали работать из-за устаревших данных. Я должен удалить эти задачи предотвратить ошибку. Такие ошибки не являются распространенными, следовательно я не хочу поддерживать нормализованную теневую таблицу.

11
задан Konerak 12 July 2010 в 13:58
поделиться

2 ответа

Не существует эквивалента в MySQL. MySQL REGEXP можно использовать для сопоставления строк, но не для их преобразования.

Вы можете либо попытаться работать с хранимыми процедурами и большим количеством логики REPLACE/SUBSTRING, либо сделать это на своем языке программирования - что должно быть самым простым вариантом.

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

.
1
ответ дан 3 December 2019 в 08:03
поделиться

Как сказал Konerak, в MySql нет эквивалента REGEXP_SUBSTR. Вы можете сделать то, что вам нужно, используя логику SUBSTRING, но это некрасиво :

SELECT
  SUBSTRING(lastPart.end, 1, LOCATE(' ', lastPart.end) - 1) AS orderId
FROM
  (
    SELECT
      SUBSTRING(dataset.description, LOCATE('order_id: ', dataset.description) + LENGTH('order_id: ')) AS end
    FROM
      (
        SELECT 'abc order_id: 2 xxxx yyy aa' AS description
        UNION SELECT 'mmm order_id: 3 nn kk yw' AS description
        UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description
      ) AS dataset
    ) AS lastPart

Edit: Вы можете попробовать эту определяемую пользователем функцию, предоставляющую доступ к perl regex в MySql

SELECT 
  PREG_CAPTURE( '/.*order_id:\s(\d+).*/', dataset.description,1)
FROM
  (
    SELECT 'abc order_id: 2 xxxx yyy aa' AS description
    UNION SELECT 'mmm order_id: 3 nn kk yw' AS description
    UNION SELECT 'mmm order_id: 1523 nn kk yw' AS description
  ) AS dataset
6
ответ дан 3 December 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: