Я хочу извлечь слово из строкового столбца таблицы.
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 как текст. Я не имею никакого контроля над структурой таблицы ИЛИ форматом данных. Задачи в очереди могут повторяться. В нашей тестовой установке некоторые повторяющиеся задачи перестали работать из-за устаревших данных. Я должен удалить эти задачи предотвратить ошибку. Такие ошибки не являются распространенными, следовательно я не хочу поддерживать нормализованную теневую таблицу.
Не существует эквивалента в MySQL. MySQL REGEXP можно использовать для сопоставления строк, но не для их преобразования.
Вы можете либо попытаться работать с хранимыми процедурами и большим количеством логики REPLACE/SUBSTRING, либо сделать это на своем языке программирования - что должно быть самым простым вариантом.
Но уверены ли вы, что ваш формат данных выбран правильно? Если вам нужен order_id, не имеет ли смысл хранить его в другом столбце, чтобы можно было ставить индексы, использовать соединения и т.п.?
.Как сказал 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